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 yesterday), so I am
sure I am overlooking something simple.
The basic idea is that my application will consist of a series of modal
dialogs, that are chained together in "wizard" fashion. There will be
some processing in between dialogs, but for the most part, the user will
do some interaction with each dialog and then click "Next" or
"Previous". My thinking was that the main (root) Tk window would be
hidden and that each dialog would be modal and child to that hidden
window. Is this a reasonable way to do this in Tkinter?
I grabbed the "Dialog" class from effbot's site figuring that was good
starting point. I did modify it somewhat to convert to the grid layout
manager, based on advice in the New Mexico Tech Tkinter Reference (by
John Shipman).
When I run this (Ubuntu 6.06), I get no windows, not even the root Tk one.
Any ideas???
Thanks,
Don
#!/usr/bin/env python
from Tkinter import *
root = None
class Dialog(Toplevel):
def __init__(self, parent, title = None):
Toplevel.__init__(self, parent)
self.transient(parent)
if title:
self.title(title)
print repr(parent)
self.parent = parent
self.result = None
#body = Frame(self)
#self.initial_focus = self.body(body)
#body.pack(padx=5, pady=5)
self.initial_focus = self.body(self)
self.buttonbox()
self.bind("", self.ok)
self.bind("", self.cancel)
self.grab_set()
if not self.initial_focus:
self.initial_focus = self
self.protocol("WM_DELETE_WINDOW", self.cancel)
self.geometry("+%d+%d" % (parent.winfo_rootx()+50,
parent.winfo_rooty()+50))
self.initial_focus.focus_set()
self.wait_window(self)
#
# construction hooks
def body(self, master):
# create dialog body. return widget that should have
# initial focus. this method should be overridden
pass
def buttonbox(self):
# add standard button box. override if you don't want the
# standard buttons
box = Frame(self)
w = Button(box, text="OK", width=10, command=self.ok,
default=ACTIVE)
w.pack(side=LEFT, padx=5, pady=5)
w = Button(box, text="Cancel", width=10, command=self.cancel)
w.pack(side=LEFT, padx=5, pady=5)
self.bind("", self.ok)
self.bind("", self.cancel)
box.pack()
#
# standard button semantics
def ok(self, event=None):
if not self.validate():
self.initial_focus.focus_set() # put focus back
return
self.withdraw()
self.update_idletasks()
self.apply()
self.cancel()
def cancel(self, event=None):
# put focus back to the parent window
self.parent.focus_set()
self.destroy()
#
# command hooks
def validate(self):
print "validate"
return True # override
def apply(self):
print "apply"
pass # override
class WelcomeDialog(Dialog):
def body(self, master):
Label(master, text="First:").grid(row=0, sticky=W)
Label(master, text="Second:").grid(row=1, sticky=W)
self.e1 = Entry(master)
self.e2 = Entry(master)
self.e1.grid(row=0, column=1)
self.e2.grid(row=1, column=1)
self.cb = Checkbutton(master, text="Hardcopy")
self.cb.grid(row=2, columnspan=2, sticky=W)
self.w1 = Button(master, text="OK", width=10, command=self.ok,
default=ACTIVE)
#w.pack(side=LEFT, padx=5, pady=5)
self.w1.grid(row=3, column=0)
self.w2 = Button(master, text="Cancel", width=10,
command=self.cancel)
#w.pack(side=LEFT, padx=5, pady=5)
self.w2.grid(row=3, column=1)
def apply(self):
print "apply"
first = int(self.e1.get())
second = int(self.e2.get())
self.result = first, second
def buttonbox(self):
pass
def show_ui():
welcome = WelcomeDialog(root, "test1")
global root
root = Tk()
root.after_idle(show_ui)
root.mainloop()
--
http://mail.python.org/mailman/listinfo/python-list