Tkinter programming problem
Eric Brunel
eric.brunel at pragmadev.com
Tue Aug 5 03:40:55 EDT 2003
klappnase wrote:
>>
>># Demonstration TK interface Windows application
>># Runs ok from within IDLE
>>#
>>from Tkinter import *
>>
>>class CommonStuff: # to get common access to variables and functions
>> def __init__(self, frame):
>> self.frame = frame
>>
>> def say_hi(self):
>> print "Hello all"
>>
>>
>>class MyWidgets(Frame, CommonStuff):
>> def __init__(self, CS):
>> Frame.__init__(self, CS.frame)
>> self.quitbutton = Button(self, text='Quit', fg='red',
>>command=self.destroy)
>> self.quitbutton.pack(side=LEFT)
>> self.hi_there = Button(self, text='Hello', command=CS.say_hi)
>> self.hi_there.pack(side=LEFT)
>>
>>
>>class Application:
>> def __init__(self, master):
>> self.frame=Frame(master)
>> CS = CommonStuff(self.frame)
>>
>> displayedwidget=MyWidgets(CS)
>> displayedwidget.grid(row=0, column=0)
>> self.frame.grid(row=0, column=0)
>> displayedwidget.bind("<Destroy>", self.quit)
>> self.frame.update()
>>
>> def quit(self, event):
>> print"Quitting..."
>> self.frame.destroy() # Destroy frame and all children
>>
>>
>>root = Tk()
>>mainWin = Application(root)
>>root.mainloop()
>
>
> I think you could have it easier, if you just want to exit you
> application with the quit button:
>
> class MyWidgets(Frame, CommonStuff):
> def __init__(self, CS):
> Frame.__init__(self, CS.frame)
> self.quitbutton = Button(self, text='Quit', fg='red',
> command=self.quit)
> self.quitbutton.pack(side=LEFT)
> self.hi_there = Button(self, text='Hello', command=CS.say_hi)
> self.hi_there.pack(side=LEFT)
>
> def quit(self):
> print "Quitting..."
> sys.exit(0)
This works, but actuallly quits the application immediatly. So if you happen to
have code after the call to the Tk mainloop, it won't be executed, which might
not be what you want. Moreover, there's already a quit method defined on
MyWidgets, inherited from Frame, that does exactly what you want: quitting the
Tk mainloop. So you could just do:
def quit(self):
print "Quitting..."
Frame.quit(self)
> If you want to run it from within the interpreter (I am not sure if it
> is that what you are trying) the following might work too:
>
> class Application:
> def __init__(self, master):
> self.frame=Frame(master)
> CS = CommonStuff(self.frame)
>
> displayedwidget=MyWidgets(CS)
> displayedwidget.grid(row=0, column=0)
> self.frame.grid(row=0, column=0)
> displayedwidget.bind("<Destroy>", self.quit)
> self.frame.update()
>
> self.master = master
>
> def quit(self, event):
> print"Quitting..."
> self.master.destroy() # Destroy root window
This may also work, but the most common way is the one I describe above. If you
want to do it here, you can do:
def quit(self, event):
print "Quitting..."
self.master.quit()
AFAIK, all Tkinter widgets have a quit method that will quit the Tk mainloop.
HTH
--
- Eric Brunel <eric.brunel at pragmadev.com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com
More information about the Python-list
mailing list