【问题标题】:Why destroy() method doesn't work in my tkinter program?为什么 destroy() 方法在我的 tkinter 程序中不起作用?
【发布时间】:2020-10-06 14:18:43
【问题描述】:

为什么,当我使用 destroy() 方法时,程序没有关闭? 我尝试使用 Nick.destroy()、root.destroy() 和 self.destroy(),但它们都不起作用。 当用户输入正确的昵称并将其传出课堂时尝试关闭窗口

from tkinter import *

class Nick(Frame):
    def __init__(self, master):
        super(Nick, self).__init__(master)
        self.master = master
        self.grid()
        self.mes = None
        self.count = 0
        self.lbl = Label(self, text="WPROWADZ NICK").grid(row=1, column=1)
        self.ent =Entry(self)
        self.ent.grid(row=2, column=1)
        btn = Button(self, text="Akceptuj", command=self.accept)
        btn.grid(row=2, column=2)
        self.error = Label(self, text="")
        self.error.grid(row=3, column=1)

    def accept(self):
        self.mes = self.ent.get()
        if len(self.mes) == 0:
            self.error.config(text="Nick nie moze byc pusty")
        elif " " in self.mes:
            self.error.config(text="Nick nie moze zawierac spacji")
        else:
            global mes
            mes = self.mes
            Nick.destroy()
        if self.count == 0:
            self.error.config(text="")
            self.count+=1

def main_tk():
    root = Tk()
    root.title("ONLINE CHAT")
    root.geometry("260x100")
    app = Nick(root)
    root.mainloop()

main_tk()
print(mes)

【问题讨论】:

  • 你在一个类而不是一个类的实例上调用destroy

标签: python class tkinter methods


【解决方案1】:

最快的解决方法是将Nick.destroy() 替换为self.master.destroy()

这就是为什么您尝试过的方法不起作用的原因:

  • Nick.destroy(): Nick 类没有名为 destroy 的 @classmethod
  • root.destroy()root 只能在 main 方法中访问,.mainloop 是阻塞的。因此,当您退出主循环(通过关闭程序、ctrl + c 等)时,无需销毁根。
  • self.destroy():销毁Nick 类只会销毁它继承自的Frame,因此不会关闭整个程序

【讨论】:

  • self.destroy() 应该可以工作,因为self 是一个小部件,因此继承了destroy 方法。
  • @Fabian_Olczak,如果此答案解决了您的问题,请将其标记为已接受,以便其他人可以快速找到问题的解决方案
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2022-11-15
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 2018-01-29
相关资源
最近更新 更多