多个窗口的Tkinter示例代码,为什么按钮不能正确加载?

ADB*_*ADB 31 python class tkinter destroy

我正在写一个程序应该:

  1. 只需按一下按钮即可打开一个窗口.
  2. 按下另一个按钮关闭新打开的窗口.

我正在使用类,所以我可以稍后将代码插入到更大的程序中.但是,我无法正确加载我的按钮.

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)

结果:

Demo1窗口 Demo2窗口

  • 两个主循环并不"依赖"任何东西,它不仅仅是"被人看不起",而是完全没错.你只需要一个.对mainloop的调用是一个无限循环,当你运行多个循环时,你在无限循环中有一个无限循环.您应该删除代码中的第二次调用`mainloop`(在Demo1.new_window中),否则会让那些试图学习如何使用Tkinter的人感到困惑. (12认同)

Jar*_*red 11

您需要为第二个按钮指定master.否则它将被打包到第一个窗口.这不仅适用Button于其他小部件,也适用于其他小部件和非gui对象StringVar.

快速修复:添加帧new的第一个参数你ButtonDemo2.

可能更好:目前你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一次.选择前两个导入语句中的一个.