python-3.x - `new_root.mainloop()` 不会使主窗口无响应

标签 python-3.x tkinter tcl tk-toolkit

假设我有这个 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() 中,主窗口也会响应。

另外,关闭第二个窗口不会打印 "Done",直到其余的 tkinter 窗口关闭。为什么会这样?

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

最佳答案

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

关于python-3.x - `new_root.mainloop()` 不会使主窗口无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67007447/

相关文章:

python-3.x - 找出人们喝咖啡的平均数量——几乎正确(在异常处理方面遇到一些麻烦)

python - 一个类的方法之间的差异,哪些是 "function"哪些是 "bound method"?

python - 如何在 Tkinter 中将形状变成按钮

python - 使用cxfreeze时无法使用tkinter/python脚本设置值

tcl - 为什么使用 "after 0"而不是直接运行命令?

python - 使用 python3 时 Lambda 函数错误

python - 为什么纹理索引 31 在 Moderngl 中被覆盖?

python - 主循环和带有线程的文本

tcl - 获取TCL中执行代码的行号

python - 知道将 Python 与 Tcl 接口(interface)的任何创造性方法吗?