467,919 Members | 1,209 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 467,919 developers. It's quick & easy.

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.verb ose,
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"
exec (strCommand)
def editSettings(self):
""" Callback called when the 'Edit Settings' button is pressed """
win = Tkinter.Toplevel()
settingsDlg = SettingsDialog (win)
def done(self):
""" Callback called when the 'Done' button is pressed """
self.quit()

# ******** start() ************************************************
def start():
"""
Start the Script Dialog GUI
"""
rootWindow = Tkinter.Tk()
rootWindow.title('Script Player - Version L1.0')
ScriptDialog (rootWindow)
rootWindow.mainloop()

# ******* SocketSettingsDialog class *********************************
class SettingsDialog(Frame):
""" Setttings Dialog GUI class """
def __init__(self, parent=None):
""" Settings Dialog GUI class constructor """
Frame.__init__(self, parent)
self.pack()
buttonRow2 = Frame(self)
self.theWidget = self
doneBtn = Button(buttonRow2, text='Done', command=self.destroy)
doneBtn.pack(side=Tkinter.RIGHT)
buttonRow2.pack(side=Tkinter.TOP, expand=Tkinter.YES,
fill=Tkinter.X)
self.pack(expand=Tkinter.YES, fill=Tkinter.BOTH)
def done(self):
""" Callback called when the 'Done' button is pressed """
self.destroy()

start()

May 18 '06 #1
  • viewed: 3173
Share:
1 Reply
On Thu, 18 May 2006 08:41:20 -0400, Michael Yanowitz
<m.********@kearfott.com> 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+-'])"
May 18 '06 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by Thomas Nücker | last post: by
3 posts views Thread by DoubleM | last post: by
2 posts views Thread by Stewart Midwinter | last post: by
reply views Thread by Stewart Midwinter | last post: by
5 posts views Thread by annagel | last post: by
3 posts views Thread by dwelch91 | last post: by
5 posts views Thread by H J van Rooyen | last post: by
6 posts views Thread by marcoberi | last post: by
44 posts views Thread by bg_ie | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.