python - 使用类时如何停止 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()
推荐阅读
- mariadb - 我打算用 MHA 设置设置数据库服务器,我需要关于数据库结构的建议
- c# - .NET 5 源代码生成器。如何使用还引用的程序集
- javascript - 更改请求标头 SOCKET.IO(无需断开连接和重新连接)
- phpstorm - 如何对齐 PHP/JavaScript 代码块?
- android - 如何检查我的 Android 应用程序是否与 Google Fit 应用程序断开连接
- java - BufferedInputStream / BufferedOutputStream 的文件读/写速度
- ios - 推送通知的 Xcode 配置文件
- asp.net - 我可以从 Azure DevOps 的存储库直接部署到 Azure 虚拟机吗?
- kubernetes - Minikube 无法通过 curl 访问保险库以进行自动身份验证代理配置
- javascript - 如何将计数器添加到相同元素的列表中