On Feb 28, 11:06 pm, John Salerno <johnj...@gmail.com> 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

Reply via email to