Tkinter example code for multiple windows, why won't buttons load correctly?
I rewrote your code in a more organized, better-practiced way:
import tkinter as tkclass Demo1: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.button1 = tk.Button(self.frame, text = 'New Window', width = 25, command = self.new_window) self.button1.pack() self.frame.pack() def new_window(self): self.newWindow = tk.Toplevel(self.master) self.app = Demo2(self.newWindow)class Demo2: def __init__(self, master): self.master = master self.frame = tk.Frame(self.master) self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25, command = self.close_windows) self.quitButton.pack() self.frame.pack() def close_windows(self): self.master.destroy()def main(): root = tk.Tk() app = Demo1(root) root.mainloop()if __name__ == '__main__': main()
Result:
You need to specify the master for the second button. Otherwise it will get packed onto the first window. This is needed not only for Button
, but also for other widgets and non-gui objects such as StringVar
.
Quick fix: add the frame new
as the first argument to your Button
in Demo2
.
Possibly better: Currently you have Demo2
inheriting from tk.Frame
but I think this makes more sense if you change Demo2
to be something like this,
class Demo2(tk.Toplevel): def __init__(self): tk.Toplevel.__init__(self) self.title("Demo 2") self.button = tk.Button(self, text="Button 2", # specified self as master width=25, command=self.close_window) self.button.pack() def close_window(self): self.destroy()
Just as a suggestion, you should only import tkinter
once. Pick one of your first two import statements.
#!/usr/bin/env pythonimport Tkinter as tkfrom Tkinter import *class windowclass(): def __init__(self,master): self.master = master self.frame = tk.Frame(master) self.lbl = Label(master , text = "Label") self.lbl.pack() self.btn = Button(master , text = "Button" , command = self.command ) self.btn.pack() self.frame.pack() def command(self): print 'Button is pressed!' self.newWindow = tk.Toplevel(self.master) self.app = windowclass1(self.newWindow)class windowclass1(): def __init__(self , master): self.master = master self.frame = tk.Frame(master) master.title("a") self.quitButton = tk.Button(self.frame, text = 'Quit', width = 25 , command = self.close_window) self.quitButton.pack() self.frame.pack() def close_window(self): self.master.destroy()root = Tk()root.title("window")root.geometry("350x50")cls = windowclass(root)root.mainloop()