diff -r 6c2e2de5ab8e Lib/idlelib/query.py --- a/Lib/idlelib/query.py Sat Jul 30 23:51:13 2016 -0700 +++ b/Lib/idlelib/query.py Mon Aug 01 10:49:32 2016 -0700 @@ -21,10 +21,11 @@ import importlib import os from sys import executable, platform # Platform is set for one test. -from tkinter import Toplevel, StringVar +from tkinter import Toplevel, StringVar, W, E, N, S from tkinter import filedialog from tkinter.messagebox import showerror from tkinter.ttk import Frame, Button, Entry, Label +from tkinter.font import Font class Query(Toplevel): """Base class for getting verified answer from a user. @@ -47,13 +48,22 @@ """ Toplevel.__init__(self, parent) self.withdraw() # Hide while configuring, especially geometry. - self.configure(borderwidth=5) self.resizable(height=False, width=False) self.title(title) self.transient(parent) self.grab_set() + windowingsystem = self.tk.call('tk', 'windowingsystem') + if windowingsystem == 'aqua': + try: + self.tk.call('::tk::unsupported::MacWindowStyle', 'style', + self._w, 'moveableModal', '') + except: + pass self.bind('', self.ok) self.bind('', self.cancel) + if windowingsystem == 'aqua': + self.bind("", self.ok) + self.bind("", self.cancel) self.protocol("WM_DELETE_WINDOW", self.cancel) self.parent = parent self.message = message @@ -75,25 +85,29 @@ def create_widgets(self): # Call from override, if any. # Bind to self widgets needed for entry_ok or unittest. - self.frame = frame = Frame(self, borderwidth=2, relief='sunken', ) + self.frame = frame = Frame(self, padding=10) + frame.grid(column=0, row=0, sticky='news') + frame.grid_columnconfigure(0, weight=1) + entrylabel = Label(frame, anchor='w', justify='left', text=self.message) self.entryvar = StringVar(self, self.text0) self.entry = Entry(frame, width=30, textvariable=self.entryvar) self.entry.focus_set() + self.errmsg = Label(frame, text=' ', foreground='red', + font=Font(name='TkCaptionFont', exists=True, root=self.parent)) - buttons = Frame(self) - self.button_ok = Button(buttons, text='Ok', default='active', - width=8, command=self.ok) - self.button_cancel = Button(buttons, text='Cancel', - width=8, command=self.cancel) + self.button_ok = Button(frame, text='OK', default='active', + command=self.ok) + self.button_cancel = Button(frame, text='Cancel', + command=self.cancel) - frame.pack(side='top', expand=True, fill='both') - entrylabel.pack(padx=5, pady=5) - self.entry.pack(padx=5, pady=5) - buttons.pack(side='bottom') - self.button_ok.pack(side='left', padx=5) - self.button_cancel.pack(side='right', padx=5) + entrylabel.grid(column=0, row=0, columnspan=3, padx=5, sticky=W) + self.entry.grid(column=0, row=1, columnspan=3, padx=5, sticky=W+E, + pady=[10,0]) + self.errmsg.grid(column=0, row=98, columnspan=3, padx=5, sticky=W+E) + self.button_ok.grid(column=1, row=99, padx=5) + self.button_cancel.grid(column=2, row=99, padx=5) def entry_ok(self): # Example: usually replace. "Return non-blank entry or None." @@ -217,9 +231,11 @@ browse = Button(frame, text='Browse', width=8, command=self.browse_file) - pathlabel.pack(anchor='w', padx=5, pady=3) - self.path.pack(anchor='w', padx=5, pady=3) - browse.pack(pady=3) + pathlabel.grid(column=0, row=2, columnspan=3, padx=5, pady=[10,0], + sticky=W) + self.path.grid(column=0, row=3, columnspan=2, padx=5, sticky=W+E, + pady=[10,0]) + browse.grid(column=2, row=3, padx=5, sticky=W+S) def askfilename(self, filetypes, initdir, initfile): # htest # # Extracted from browse_file so can mock for unittests.