On Sun, Nov 13, 2011 at 1:27 PM, Jason Swails <jason.swa...@gmail.com>wrote:
> Hello, > > I'm trying my hand at creating a Tkinter application, but not having much > luck. I'm trying to have my top level window be a series of buttons with > different options on them. Every time a button is pressed, it opens up a > new window with options. While that new window is open, all of the buttons > on the original window are disabled. However, I want all of those buttons > to become active again once I quit my new window. I can't seem to > reactivate those buttons no matter what I do. > > This is the approach I'm trying: > > #!/usr/bin/env python > > from Tkinter import * > > class ActionButton(Button): > def __init__(self, frame, text): > self.frame = frame > Button.__init__(self, master=self.frame, text=text, > command=self.execute) > def execute(self): > window = Toplevel() > new_button = ActionButton(window, '2nd level button') > quit_button = Button(window, text='Quit!', command=window.destroy) > window.buttons = [new_button, quit_button] > for button in window.buttons: button.pack() > # Deactivate buttons from containing shell > for button in self.frame.buttons: button.config(state=DISABLED) > window.mainloop() > for button in self.frame.buttons: button.config(state=ACTIVE) > > > top = Tk() > top_button = ActionButton(top, 'Button on top!') > top_button.pack() > quit_button = Button(top, text='Quit', command=top.destroy) > quit_button.pack() > > top.buttons = [top_button, quit_button] > > top.mainloop() > > I'm really kind of running around in the dark here, so any advice or > explanation is appreciated. > Another approach I think will work, and that I'm going to try, is to subclass Toplevel and simply assign the higher-level frame/window as an instance attribute. Then, I can reactivate all of the buttons in the destroy() method before calling the destroy() method of Toplevel on self. Something like this: [untested] class MyToplevel(Toplevel): def __init__(self, root, **options): self.root = root Toplevel.__init__(self, options) for button in self.root.buttons: button.config(state=DISABLED) def destroy(self): for button in self.root.buttons: button.config(state=ACTIVE) Toplevel.destroy(self) This allows me to avoid running "mainloop()" on a non-root Toplevel instance, but links the re-activation of the buttons with the destruction of the child window (which was the effect I was going for). I must not understand what mainloop() does, fully (does it only make sense to run it on Tkinter.Tk()?) Thanks! Jason
-- http://mail.python.org/mailman/listinfo/python-list