472,811 Members | 1,323 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,811 software developers and data experts.

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
1 3489
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 thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

1
by: Thomas Nücker | last post by:
Hi! I am creating a dialog-box within my application, using tkinter. The problem is the following: After the dialogbox is started, the main application window comes again to top and the...
3
by: DoubleM | last post by:
Hi, I'm running Python2.3.3c1 on Mandrake 9.1 The following code is designed to bring up a window with a button labeled "popup". Clicking on the popup buttons triggers a secondary window with...
2
by: Stewart Midwinter | last post by:
I would like to link the contents of three OptionMenu lists. When I select an item from the first list (call it continents), the contents of the 2nd list (call it countries) would update. And in...
0
by: Stewart Midwinter | last post by:
I've got a Tkinter app that draws three histograms. At this point I am simulating real data by drawing rectangles whose size is defined by random numbers; in the future there would be real data...
5
by: annagel | last post by:
I am looking for a way to force a Tkinter window into focus on a system level. I know the force focus method should bring one window of my application into focus, but it seems I need to have some...
3
by: dwelch91 | last post by:
I'm trying unsuccessfully to do something in Tk that I though would be easy. After Googling this all day, I think I need some help. I am admittedly very novice with Tk (I started with it...
5
by: H J van Rooyen | last post by:
Hi, I am struggling to get the pack method to do what I intend. I am trying to display user input in a seperate window, along with a little description of the field, something like this: ...
6
by: marcoberi | last post by:
Hi everybody. I have this code snippet that shows a window without a titlebar (using overrideredirect) and two buttons on it: one quits and the other one brings up a simple tkMessageBox. On...
44
by: bg_ie | last post by:
Hi, I'm in the process of writing some code and noticed a strange problem while doing so. I'm working with PythonWin 210 built for Python 2.5. I noticed the problem for the last py file...
0
by: erikbower65 | last post by:
Using CodiumAI's pr-agent is simple and powerful. Follow these steps: 1. Install CodiumAI CLI: Ensure Node.js is installed, then run 'npm install -g codiumai' in the terminal. 2. Connect to...
0
by: kcodez | last post by:
As a H5 game development enthusiast, I recently wrote a very interesting little game - Toy Claw ((http://claw.kjeek.com/))。Here I will summarize and share the development experience here, and hope it...
14
DJRhino1175
by: DJRhino1175 | last post by:
When I run this code I get an error, its Run-time error# 424 Object required...This is my first attempt at doing something like this. I test the entire code and it worked until I added this - If...
0
by: Rina0 | last post by:
I am looking for a Python code to find the longest common subsequence of two strings. I found this blog post that describes the length of longest common subsequence problem and provides a solution in...
5
by: DJRhino | last post by:
Private Sub CboDrawingID_BeforeUpdate(Cancel As Integer) If = 310029923 Or 310030138 Or 310030152 Or 310030346 Or 310030348 Or _ 310030356 Or 310030359 Or 310030362 Or...
0
by: lllomh | last post by:
Define the method first this.state = { buttonBackgroundColor: 'green', isBlinking: false, // A new status is added to identify whether the button is blinking or not } autoStart=()=>{
0
by: lllomh | last post by:
How does React native implement an English player?
0
by: Mushico | last post by:
How to calculate date of retirement from date of birth
2
by: DJRhino | last post by:
Was curious if anyone else was having this same issue or not.... I was just Up/Down graded to windows 11 and now my access combo boxes are not acting right. With win 10 I could start typing...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.