Tkinter Listbox.curselection() error?
Bob
cokefiend66 at hotmail.com
Thu Oct 3 01:49:25 EDT 2002
More information about the Python-list mailing list
Thu Oct 3 01:49:25 EDT 2002
- Previous message (by thread): Tkinter Listbox.curselection() error?
- Next message (by thread): Ads for jhom and jhom cards
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
I think not having a mainloop() call was ok because wait_window enters the event processing loop. I also tested this as part of my larger program which does have a normal mainloop and still got the same error. I hadn't thought about the fact that the widget was already destroyed when I tried to read its contents, but you're absolutely right. I moved the code to create the Font object to the ok callback and stored it in a member variable that getFont() can return and everything works great now (except that my dialog is so ugly :) ). Thanks for your help! -Bob Chad Netzer <cnetzer at mail.arc.nasa.gov> wrote in message news:<mailman.1033586767.32004.python-list at python.org>... > On Wednesday 02 October 2002 00:08, Bob wrote: > > Hello, > > I'm trying to write a fairly simple font selection dialog for a > > bigger application I'm working on. Every time I try to use the > > curselection() method on a listbox I created I get a weird tcl error. > > Can anyone tell me what I'm doing wrong? Any help would be much > > appreciated. > > > > [snipped long class definition] > > > > if( __name__ == "__main__" ): > > root = Tk(); > > fb = ERGFontChooser( root ); > > > > f = fb.getFont(); > > > > print( `f` ); > > print( f.actual() ); > > You initialize Tk, and create ERGFontChooser, but you never enter into > the TK mainloop(). So, first, put root.mainloop() at the end of the > program. Then delete the use of fb.getFont() outside of the mainloop, > since it won't work like you want it to. (see below) > > When I run what you have, I get the error only when I hit "OK" or > "Cancel", causing self.top.destroy() to be run. But since the > mainloop() was never entered, the Tk state is not fully defined, and so > this isn't unexpected. You can't use getFont() outside of the mainloop > (at least, not effectively) without expecting these kinds of trouble. > Outside of the mainloop() Tk isn't really processing events; you could > call an after_idle(), before entering mainloop, to start some > prcoessing that isn't event based (such as forcing the window to raise, > etc.), but I won't guarantee the results. > > Also, using wait_window() in getFont, doesn't seem right. After all, > getFont() MUST stall until the Toplevel window is destroyed (which will > destroy all the widgets in it.) At which point, getFont() tries to > continue operating on Tkinter widgets that are now destroyed. > > If I put the getFont() call in the ok() method (changing it to > self.getFont()), and get rid of the wait_window() call in getFont(), > then it does what I think you want: It returns the font info when you > press 'Ok', and destroys the window. Here is the end of the program as > I wrote it: > > def getFont( self ): > > # we have returned > items = self.familyBox.curselection(); > fam = self.familyBox.get( items[0] ); > if( self.boldVar.get() == 0 ): > weight = NORMAL; > else: > weight = BOLD; > > font = Font( self.root, family = fam ); > font.config( size = self.sizeVar.get(), > weight = weight ); > > return font; > > def ok( self, event=None ): > f = self.getFont(); > > print( `f` ); > print( f.actual() ); > > print "OK"; > self.top.destroy(); > > if( __name__ == "__main__" ): > root = Tk(); > fb = ERGFontChooser( root ); > > root.mainloop() > > > Oh, and lay off the coke, Bob. :)
- Previous message (by thread): Tkinter Listbox.curselection() error?
- Next message (by thread): Ads for jhom and jhom cards
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Python-list mailing list