python-3.x - Tkinter,窗口没有关闭
问题描述
我正在创建一个运行良好的游戏,但是当我关闭窗口时它给出了这个错误:
_tkinter.TclError: can't invoke "update" command: application has been destroyed error
为了解决这个问题,我在 while 循环之前添加了这段代码,这是我从这里提出的另一个问题中得到的。
x = True
def update_x():
global x
x = False
tk.protocol("WM_DELETE_WINDOW", update_x)
while循环是:
while x == True:
draw()
time.sleep(0.1)
tk.update()
窗户现在根本关不上。我究竟做错了什么?我真的不知道如何使用 mainloop 方法,有没有办法使用上面的 while 循环使其工作?
解决方案
首先,我很确定当您覆盖“WM_DELETE_WINDOW”时,您应该tk.destroy()
在函数结束时调用(update_x),否则窗口不会被破坏。其次,如果“x”总是一个布尔值,最好说:while x: do_smth()
而不是while x == True
和while not x
而不是while x == False
。如果您在这些更改后仍然有问题,您可以做两件事:首先,您可以检查窗口是否存在,然后像这样更新它:if tk.winfo_exists(): tk.update()
或者可能在您的新协议函数(update_x)的末尾,而不是tk.destroy()
您可以编写tk.quit()
安全退出程序。
推荐阅读
- google-cloud-platform - 如何从 stackdriver 日志中触发 google 函数,类似于我们在 AWS 中使用 cloudwatch 事件触发 lambda 的方式?
- laravel - 在 Laravel 中以嵌套样式获取单个表数据
- puppet - 组安装“GNOME 桌面”
- linux - 为什么系统调用会破坏 rcx 和 r11?
- c++ - 无效的句柄窗口调试器
- java - 自动装配在 XML 中定义的 bean - Spring Boot
- python - 模块存在,pyCharm 建议我的名称,但导入失败
- mysql - SQL:如果满足其他行的条件,则在并发情况下更新一行
- node.js - node.js 与 docker 中的子进程
- python - 如何使用 matplotlib / seaborn 和 pandas 数据框创建具有共享 x 轴的倒置条形图