我对tk.mainloop()的理解是,它将运行并处理与第一个创建的Tcl解释器相关的窗口事件,而<widget>.mainloop()将处理与小部件链接的解释器相关的窗口事件。然后我发现了这样的代码:
from tkinter import *
root1 = Tk()
root2 = Tk()
root1.mainloop() # Shouldn't this just handle the events of the first window根据我的理解,我认为这段代码应该只处理与root1相关的事件,但是root2也出现了,它也具有响应性(这意味着它的事件也正在被处理.?)。如果我对mainloop()工作方式的理解是错误的,请纠正我。
谢谢:D
发布于 2021-08-15 19:12:24
mainloop()方法在当前线程上运行事件处理循环,直到线程中启动的所有窗口关闭或调用quit()方法(在内部设置由核心事件循环运行者检查的标志)。它阻塞线程,只是它根据需要执行所有已注册的回调。底层机器实际上并不与任何特定的窗口相关联,而是与线程相关联。只是不愿将事物映射为空闲函数,尽管它们确实是这样的。
强烈建议您不要同时使用两次调用tkinter.Tk()的结果。这是可行的,但结果可能会很混乱。如果您一次从几个线程中执行这个操作,它可能会变得更加令人困惑(除了在macOS上由于混乱的原因之外,这应该是可行的),但结果往往是令人费解的)。(这不适用于tkinter.Tcl();当执行多次和多个线程时,这确实是合理的。它生成的对象是线程绑定的,但是有许多实例是合理的,您可以在它们自己的线程中或在一起拥有这些实例。)
像您所做的那样,对tkinter.Tk()的两个调用是创建两个独立的底层Tcl/Tk环境(技术术语是一个“解释器”,尽管它有一个字节码编译器等等)共享一个线程。从Tcl/Tk的角度来看,这是明智的,因为Tcl使用的安全模型非常不同,但从Python的角度来看,这几乎是一派胡言。其效果可以用小规模的操作来描述,但要更广泛地理解它们是非常困难的,建议您不要尝试。
https://stackoverflow.com/questions/68792577
复制相似问题