Re: Tkinter Dialog Management problems:
On Thu, 18 May 2006 11:52:54 -0400, Michael Yanowitz <[EMAIL PROTECTED]> wrote: > Thanks. That helped alot. No problem. > 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 > > > 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. No, they're not! Never - and I mean *never* - create two instances of Tk in the same application! The Tk instance does not only represent the main window for the application, but also creates the underlying tcl interpreter. Creating two instances of Tk will then create two interpreters and you'll never know which one executes your commands, producing weird TclError's everywhere. If you have a window which can be considered as the main window for your application - there is only one of it, it is always there and closing it means quitting the application -, then make it a sub-class of Tk. If you do not have such a window, use the following trick at the beginning of your application: root = Tkinter.Tk() root.withdraw() This basically creates a main window and immediately hides it. All your other windows must be sub-classes of Toplevel. Calling the quit method of these windows should still quit the application, and calling the destroy method should only close the window. As for tutorials, there are many; just see there: http://tkinter.unpy.net/wiki/Tkinter Apart from the one already given by Rony (which is more a reference than a tutorial), my favorite ones are: - Stephen Ferg's "Thinking in Tkinter" - http://www.ferg.org/thinking_in_tkinter/index.html - The one at http://doctormickey.com/python/index.html - Gerard Swinnen's "Apprendre a programmer avec Python" (in French) - http://www.cifen.ulg.ac.be/inforef/swi/python.htm At least, these ones avoid the confusion Frame/window usually found in many others: the first two don't use inheritance at all; only the last (the one in French) implements windows as sub-classes of Tk or Toplevel. Unfortunately, I don't know any english translation of it. A last advice: if you want to do serious Tkinter, it really helps to know how the underlying tcl/tk layer works. So maybe you should learn at least the basics of tcl/tk. And if you do that, you will be able to use tcl/tk resources, such as: http://www.tcl.tk/man/ which is the only documentation I ever need now... HTH -- python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])" -- http://mail.python.org/mailman/listinfo/python-list
RE: Tkinter Dialog Management problems:
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 > > > 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 -- http://mail.python.org/mailman/listinfo/python-list
RE: Tkinter Dialog Management problems:
> 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 > 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. -- http://mail.python.org/mailman/listinfo/python-list
Re: Tkinter Dialog Management problems:
On Thu, 18 May 2006 08:41:20 -0400, Michael Yanowitz <[EMAIL PROTECTED]> wrote: > 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. HTH -- python -c "print ''.join([chr(154 - ord(c)) for c in 'U(17zX(%,5.zmz5(17l8(%,5.Z*(93-965$l7+-'])" -- http://mail.python.org/mailman/listinfo/python-list
Tkinter Dialog Management problems:
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? 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? 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. Thanks in advance: """ TkInter Test """ #** Imports * import os import sys import Tkinter from Tkinter import Tk, Frame, Button, Label, Entry, Scrollbar from Tkinter import Text, Checkbutton, IntVar import tkFileDialog from tkMessageBox import askyesno, showerror # *** runScript() * def runScript (strFilename): """ Executes Python script file """ if (VERBOSE): print strFilename, "is being imported" fileText = "" try: fptr = open (strFilename, 'r') fileText = fptr.read() fptr.close() except Exception, (errno): print "Exception in import of file:", strFilename, "- Errno = ", errno print (sys.exc_info()) showerror ('Error', 'Problem importing file - see console for details') else: fname = [strFilename[:-3].split('/')[-1]] for f in fname: __import__(f) # *** getGUIFilename *** def getGUIFilename(): """ returns a tkInter File Selection Dialog """ strFilename = tkFileDialog.askopenfilename(initialdir='.', filetypes=[('Python files','*.py'), ('All Files','*.*')]) return strFilename # *** ScenarioPlayerDialog class * class ScriptDialog(Frame): """ Script Dialog GUI class """ def __init__(self, parent=None): """ Script GUI class constructor """ Frame.__init__(self, parent) self.pack() self.commandRow = Frame(self) self.commandLabel = Label(self.commandRow, width=14, text="Python Command:") self.commandEnt = Entry(self.commandRow) self.commandRow.pack(side=Tkinter.TOP, fill=Tkinter.X) self.commandLabel.pack(side=Tkinter.LEFT) self.commandEnt.pack(side=Tkinter.RIGHT, expand=Tkinter.YES, fill=Tkinter.X) self.commandEnt.delete('0', Tkinter.END) self.commandEnt.pack(side=Tkinter.TOP, fill=Tkinter.X) buttonRow3 = Frame(self) doneBtn = Button(buttonRow3, text='Done', command=self.done) doneBtn.pack(side=Tkinter.RIGHT) buttonRow3.pack(side=Tkinter.BOTTOM, expand=Tkinter.YES, fill=Tkinter.X) buttonRow2 = Frame(self) runBtn = Button(buttonRow2, text='Run Script', command=self.playScript) runBtn.pack(side=Tkinter.LEFT) buttonRow2.pack(side=Tkinter.BOTTOM, expand=Tkinter.YES, fill=Tkinter.X) buttonRow1 = Frame(self) executeBtn = Button(buttonRow1, text='Execute Command') executeBtn.pack(side=Tkinter.LEFT) settingsBtn = Button(buttonRow1, text='Settings...', command=self.editSettings) settingsBtn.pack(side=Tkinter.LEFT) self.verbose = Tkinter.IntVar() Checkbutton(self,text="Verbose",variable=self.verbose, command=self.setVerbosity).pack(side=Tkinter.RIGHT) buttonRow1.pack(side=Tkinter.BOTTOM, expand=Tkinter.YES, fill=Tkinter.X) self.pack(expand=Tkinter.YES, fill=Tkinter.BOTH) self.theParent = parent def setVerbosity(self): """ Callback called when the 'Verbose' RadioButton is pressed """ global VERBOSE VERBOSE = self.verbose.get() def playScript(self): """ Callback called when the 'Run Script' button is pressed """ sFilename = getGUIFilename() if (VERBOSE): print "Running script file: ", sFilename runScript (sFilename) def editScript(self): """ Callback called when the 'Edit Script' button is pressed """ sFilename = getGUIFilename() editScript (sFilename) def executeCommand(self): """ Callback called when the 'Execute Command' button is pressed """ strCommand = self.commandEnt.get() if (VERBOSE): print strCommand, "is being executed" e