diff -r 6c2e2de5ab8e Lib/idlelib/searchbase.py --- a/Lib/idlelib/searchbase.py Sat Jul 30 23:51:13 2016 -0700 +++ b/Lib/idlelib/searchbase.py Mon Aug 01 11:28:18 2016 -0700 @@ -1,7 +1,7 @@ '''Define SearchDialogBase used by Search, Replace, and Grep dialogs.''' -from tkinter import Toplevel, Frame -from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton +from tkinter import Toplevel, N, W, E, S +from tkinter.ttk import Entry, Label, Button, Checkbutton, Radiobutton, Frame class SearchDialogBase: '''Create most of a 3 or 4 row, 3 column search dialog. @@ -43,6 +43,8 @@ self.root = root self.engine = engine self.top = None + self.windowingsystem = root.tk.call('tk', 'windowingsystem') + def open(self, text, searchphrase=None): "Make dialog visible on top of others and ready to use." @@ -75,14 +77,19 @@ top = Toplevel(self.root) top.bind("", self.default_command) top.bind("", self.close) + if self.windowingsystem == 'aqua': + top.bind("", self.default_command) + top.bind("", self.close) top.protocol("WM_DELETE_WINDOW", self.close) top.wm_title(self.title) top.wm_iconname(self.icon) self.top = top + self.inner = Frame(top, padding=10) + self.inner.grid(column=0, row=0, sticky=N+W+E+S) self.row = 0 - self.top.grid_columnconfigure(0, pad=2, weight=0) - self.top.grid_columnconfigure(1, pad=2, minsize=100, weight=100) + self.inner.grid_columnconfigure(0, pad=2, weight=0) + self.inner.grid_columnconfigure(1, pad=2, minsize=100, weight=100) self.create_entries() # row 0 (and maybe 1), cols 0, 1 self.create_option_buttons() # next row, cols 0, 1 @@ -95,9 +102,9 @@ entry - gridded labeled Entry for text entry. label - Label widget, returned for testing. ''' - label = Label(self.top, text=label_text) + label = Label(self.inner, text=label_text) label.grid(row=self.row, column=0, sticky="nw") - entry = Entry(self.top, textvariable=var, exportselection=0) + entry = Entry(self.inner, textvariable=var, exportselection=0) entry.grid(row=self.row, column=1, sticky="nwe") self.row = self.row + 1 return entry, label @@ -113,11 +120,11 @@ label - Label widget, returned for testing. ''' if labeltext: - label = Label(self.top, text=labeltext) - label.grid(row=self.row, column=0, sticky="nw") + label = Label(self.inner, text=labeltext) + label.grid(row=self.row, column=0, sticky=W) else: label = '' - frame = Frame(self.top) + frame = Frame(self.inner) frame.grid(row=self.row, column=1, columnspan=1, sticky="nwe") self.row = self.row + 1 return frame, label @@ -129,7 +136,7 @@ A gridded frame from make_frame is filled with a Checkbutton for each pair, bound to the var, with the corresponding label. ''' - frame = self.make_frame("Options")[0] + frame = self.make_frame("Options:")[0] engine = self.engine options = [(engine.revar, "Regular expression"), (engine.casevar, "Match case"), @@ -147,7 +154,7 @@ Others is a list of value, label pairs. A gridded frame from make_frame is filled with radio buttons. ''' - frame = self.make_frame("Direction")[0] + frame = self.make_frame("Direction:")[0] var = self.engine.backvar others = [(1, 'Up'), (0, 'Down')] for val, label in others: @@ -161,16 +168,21 @@ text=label, command=command, default=isdef and "active" or "normal") cols,rows=self.buttonframe.grid_size() - b.grid(pady=1,row=rows,column=0,sticky="ew") + if self.windowingsystem == 'win32': + b.grid(pady=[0,2], row=rows, column=0, sticky=E+W) + else: + b.grid(column=cols, row=0, padx=2) self.buttonframe.grid(rowspan=rows+1) return b def create_command_buttons(self): "Place buttons in vertical command frame gridded on right." - f = self.buttonframe = Frame(self.top) - f.grid(row=0,column=2,padx=2,pady=2,ipadx=2,ipady=2) - - b = self.make_button("close", self.close) + f = self.buttonframe = Frame(self.inner) + if self.windowingsystem == 'win32': + f.grid(row=0, column=2, padx=[5,0], pady=0) + else: + f.grid(row=99, column=0, columnspan=2, sticky=E, pady=[10,0]) + b = self.make_button("Close", self.close) b.lower()