ADB*_*ADB 31 python class tkinter destroy
我正在写一个程序应该:
我正在使用类,所以我可以稍后将代码插入到更大的程序中.但是,我无法正确加载我的按钮.
import tkinter as tk
class Demo1(tk.Frame):
def __init__(self):
tk.Frame.__init__(self)
self.pack()
self.master.title("Demo 1")
self.button1 = tk.Button(self, text = "Button 1", width = 25,
command = self.new_window)
self.button1.grid(row = 0, column = 1, columnspan = 2, sticky = tk.W+tk.E+tk.N+tk.S)
def new_window(self):
self.newWindow = Demo2()
class Demo2(tk.Frame):
def __init__(self):
new = tk.Frame.__init__(self)
new = tk.Toplevel(self)
new.title("Demo 2")
new.button = tk.Button(text = "Button 2", width = 25,
command = self.close_window)
new.button.pack()
def close_window(self):
self.destroy()
def main():
Demo1().mainloop()
if __name__ == '__main__':
main()
Run Code Online (Sandbox Code Playgroud)
Rus*_*hal 45
我以更有条理,更好实践的方式重写了您的代码:
import tkinter as tk
class 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()
Run Code Online (Sandbox Code Playgroud)
结果:
Jar*_*red 11
您需要为第二个按钮指定master.否则它将被打包到第一个窗口.这不仅适用Button于其他小部件,也适用于其他小部件和非gui对象StringVar.
快速修复:添加帧new的第一个参数你Button在Demo2.
可能更好:目前你Demo2继承了tk.Frame但我觉得如果你改成这样的话会更有意义Demo2,
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()
Run Code Online (Sandbox Code Playgroud)
就像一个建议,你应该只导入tkinter一次.选择前两个导入语句中的一个.