如何解决使用类时如何停止 Tkinter 程序
我正在使用 python 创建一个控制 Tkinter 窗口的类对象。我的代码如下所示:
class MyGui:
def __init__(self):
self.root = tk.Tk()
self.root.title("My Gui")
return
def makeButton(self,text,on_click_function,should_pack = True):
""" Makes a button widget """
button = tk.Button(self.root,text=text,command=on_click_function)
if should_pack:
button.pack()
return button
def start(self):
self.root.mainloop()
def stop(self):
self.root.destroy()
我希望能够启动类的一个实例,然后像这样停止它:
a = MyGui()
a.makeButton('STOP',a.stop)
a.start()
... // OTHER CODE HERE EVENTUALLY // ...
一切正常,窗口在 start()
上成功创建,当点击按钮并执行 stop()
时它消失。问题是主循环继续运行。我必须使用 Ctrl+C 手动终止程序,它显示它在 self.tk.mainloop(n)
处被终止。
如果我只是在一个普通文件而不是一个类中执行我的所有 tkinter 代码,一切都一样,但是当我在 root 上调用 destroy 时主循环也会停止,并且程序结束。然而,如果我把它放在一个类中,尽管窗口被破坏,mainloop 也不会停止。
为什么?我怎样才能让它停止主循环? (我可以通过调用 sys.exit
来停止整个程序,但我想在通过按下按钮调用 stop
后继续执行非 Gui 的东西)。
解决方法
我发现如果将 self.root.quit()
和 self.root.destroy()
放在 stop()
函数中可以解决问题,但如果单独使用它们(仅使用 destroy
关闭窗口但保持主循环运行;仅使用 quit
取消主循环但保持窗口打开并处于一种奇怪的状态,当您尝试手动关闭它时会导致崩溃)。
所以类函数实际上需要看起来像这样:
def stop(self):
self.root.quit()
self.root.destroy()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。