gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:30:21 25 4
gpt4 key购买 nike

假设我有这个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com