Tkinter Dialog Management problems:
Rony Steelandt
bucodi at yahoo.fr.invalid
Thu May 18 12:09:30 EDT 2006
If you need a beginners tutorial for Tkinter, try this one :
http://www.pythonware.com/library/tkinter/introduction/
>> Hello:
>>
>> Below I have included a stripped down version of the GUI I am working
>> on.
>> It contains 2 dialog boxes - one main and one settings. It has the
>> following
>> problems, probably all related, that I am hoping someone knows what I am
>> doing wrong:
>>
>> 1) Pressing the Settings.. Button multiple times, brings up many
>> instances
>> of the Settings Panel. I just want it to bring up one. Is there an
>> easy
>> way to do that?
>
> In fact, the two windows you created are not dialogs; they're just
> windows. To turn a window into an actual "dialog", i.e basically to make
> it modal, you have to do the following operations (supposing your dialog
> window is named dlg and your main window in named root):
>
> ## Ensure only window can receive user events
> dlg.grab_set()
> ## Force Dialog to stay on top of main window
> dlg.transient(root)
> ## Wait for dialog to be destroyed
> root.wait_window(dlg)
>
>> 2) Pressing the Done button in the Settings Panel, just erases the Done
>> button
>> (and any other widgets in the Panel). It does not dismiss the Panel.
>> Pressing
>> the X button does work. What callback is that? Can I make the Done
>> button
>> call
>> that instead? How?
>
> This is not the way it works. In fact, what you did wrong is something
> that has been around for years in some Tkinter tutorial(s): you made your
> classes inherit from Frame. This is a Bad Idea: a Frame is not a window,
> but only a generic container. There are 2 classes for windows: Tk for the
> main window and Toplevel for all others. They both also act as containers,
> so you can do in them everything you do in Frames. So make your
> ScriptDialog inherit from Tk, your SettingsDialog inherit from Toplevel,
> remove all explicit creations of Tkinter.Tk or Tkinter.Toplevel and
> instantiate your classes instead. Then calling destroy on either on the
> dialogs will actually close the window.
>
>> 3) Pressing the Done button from the Main Panel has no effect? Why not?
>> It
>> used
>> to work (self.quit()). Again, I would like to call whatever is called
>> when the
>> X button (top Right corner) is pressed.
>
> This should work. BTW, your "done" method is not needed: creating the
> Button with command=self.quit works without problem.
>
>
> Thanks. That helped alot.
> However it leaves a couple very minor problems which I think I can live
> with.
> 1) It brings up an empty additional 'main window'.
> I have tried using the Tkinter.NoDefaultRoot() option, but run into
> other problems with other things not defined.
> NameError: global name '_default_root' is not defined
> Exception exceptions.AttributeError: "IntVar instance has no attribute
> '_tk'" in
> <bound method IntVar.__del__ of <Tkinter.IntVar instance at 0x009C7990>>
> ignored
>
> 2) By deriving the 'dialog' from Tk, existing calls to self.pack() no
> longer are valid, but they don't appear to be necessary.
>
> My only 'Tkinter tutorial' is what is included in Orielly's "Programming
> Python". Still looking for a good tutorial. I am not clear what the
> difference
> between Tk() and Toplevel() are. They seem totally interchangeable.
--
---
Rony Steelandt
BuCodi
rony dot steelandt (at) bucodi dot com
Visit the python blog at http://360.yahoo.com/bucodi
More information about the Python-list
mailing list