微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

`new_root.mainloop()` 不会使主窗口无响应

如何解决`new_root.mainloop()` 不会使主窗口无响应

假设我有这个 tkinter 脚本:

import tkinter as tk

def callback():
   new_root = tk.Tk()
   new_root.mainloop()
   print("Done")

root = tk.Tk()

button = tk.Button(root,text="Click me",command=callback)
button.pack()

root.mainloop() 

根据我对 tkinter 的理解,当我按下按钮时,应该会创建一个新窗口和 tcl 解释器。运行 callback 时,主窗口 (root) 不应更新,因此应无响应。 new_root.mainloop()一个 while True 循环,一直运行到第二个窗口关闭。因此,当我按下按钮时,它应该创建一个新窗口,在其上调用 .mainloop(),这应该会使主窗口无响应。问题是这不会发生。即使代码执行卡在 new_root.mainloop() 中,主窗口也能响应。

在其余 tkinter 窗口关闭之前,关闭第二个窗口也不会打印 "Done"。为什么会这样?

我查看了 tkinter_tkinter 的源代码,但找不到任何有用的信息。我有 Python 3.7.9,tcl 8.6

解决方法

虽然你正在运行一个附属事件循环(真的不要那样做!)它仍然与外循环共享相同的事件处理程序注册表,所以进来的事件在内循环中就像在外循环中一样处理一。 (有一段常见的低级事件处理代码深入操作系统以有效地进行事件处理。该代码,即通知程序,是很少人应该接触的东西;这很棘手因为它合并了一些非常奇怪和完全不同的事件源,同时还解决了一些平台上的一堆奇怪的错误。)一旦 所有 窗口被删除,event_loop 方法就会返回。它从字面上调用具有适当标志的低级事件处理引擎(API 调用为 Tcl_DoOneEvent()),并在 while 循环中执行此操作(直到现有窗口的数量降至 1 以下;这正是 > 它在等待什么)。这就是为什么您可能不应该指望它终止并且绝对不应该将它嵌套在 GUI 回调中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。