On Feb 28, 11:06 pm, John Salerno <[email protected]> wrote:
> The book I'm reading about using Tkinter only does this when creating the
> top-level window:
>
> app = Application()
> app.mainloop()
>
> and of course the Application class has subclassed the tkinter.Frame class.
>
> However, in the Python documentation, I see this:
>
> root = Tk()
> app = Application(master=root)
> app.mainloop()
> root.destroy()
>
> Is it necessary to explicitly call Tk(), then pass that result as an argument
> for the Application call? Is it also necessary to call destroy() on the root
> frame?
It is not necessarily to call Tk explicitly, which i think is a bug
BTW. Sure, for simple scripts you can save one line of code but only
at the expense of explicitness and intuitiveness. Observe
## START CODE ##
import Tkinter as tk
root = tk.Tk()
root.title('Explicit Root')
root.mainloop()
f = tk.Frame(master=None, width=100, height=100, bg='red')
f.pack()
f.mainloop()
b = tk.Button(master=None, text='Sloppy Coder')
b.pack()
b.mainloop()
## END CODE ##
as you can see all three examples work even though the last two don't
explicitly create a master. The master is still there however Tkinter
just created "magically" for you. Talk about laziness!
> I tried the above and I got the following error:
>
> Traceback (most recent call last):
> File "C:\Users\John\Desktop\gui.py", line 12, in <module>
> root.destroy()
> File "C:\Python32\lib\tkinter\__init__.py", line 1714, in destroy
> self.tk.call('destroy', self._w)
> _tkinter.TclError: can't invoke "destroy" command: application has been
> destroyed
>
> So apparently closing the window with the X button (on Windows) implicitly
> calls the destroy() method of the root frame. If that's the case, why does
> the documentation explicitly call it?
Because the documentation is FLAWED! Please provide links to this
"documentation" so we can post it on the Wall Of Shame.
> Furthermore, I pasted the exact example from the documentation into IDLE and
> ran it, and I also go the same error, so the example in the documentation
> doesn't even work.
IDLE uses the same Python as the command line so naturally it will
throw the same error. ;-)
> So is it sufficient simply to create an Application instance, use mainloop,
> and then handle the closing of the window elsewhere in the program (such as a
> widget calling the destroy method on-click, or just letting the X button do
> it)?
Most applications will have both: user destroying, and program
destroying. Again, your example is FLAWED. Here is a simplified
example:
## START CODE ##
from tkMessageBox import askyesnocancel
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.title('Close Me -->')
self.protocol("WM_DELETE_WINDOW", self.onDestroyWindow)
def onDestroyWindow(self):
title = 'Confirm App Exit'
msg = 'Save changes before exiting?'
result = askyesnocancel(title, msg, default='cancel')
if result is None:
return
elif result is True:
print 'saving changes'
elif result is False:
print 'dont save changes'
self.destroy()
if __name__ == '__main__':
app = App()
app.mainloop()
## END CODE ##
--
http://mail.python.org/mailman/listinfo/python-list