首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更好地理解mainloop()

更好地理解mainloop()
EN

Stack Overflow用户
提问于 2021-08-15 14:41:58
回答 1查看 254关注 0票数 1

我对tk.mainloop()的理解是,它将运行并处理与第一个创建的Tcl解释器相关的窗口事件,而<widget>.mainloop()将处理与小部件链接的解释器相关的窗口事件。然后我发现了这样的代码:

代码语言:javascript
复制
from tkinter import *

root1 = Tk()
root2 = Tk()

root1.mainloop() # Shouldn't this just handle the events of the first window

根据我的理解,我认为这段代码应该只处理与root1相关的事件,但是root2也出现了,它也具有响应性(这意味着它的事件也正在被处理.?)。如果我对mainloop()工作方式的理解是错误的,请纠正我。

谢谢:D

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-15 19:12:24

mainloop()方法在当前线程上运行事件处理循环,直到线程中启动的所有窗口关闭或调用quit()方法(在内部设置由核心事件循环运行者检查的标志)。它阻塞线程,只是它根据需要执行所有已注册的回调。底层机器实际上并不与任何特定的窗口相关联,而是与线程相关联。只是不愿将事物映射为空闲函数,尽管它们确实是这样的。

强烈建议您不要同时使用两次调用tkinter.Tk()的结果。这是可行的,但结果可能会很混乱。如果您一次从几个线程中执行这个操作,它可能会变得更加令人困惑(除了在macOS上由于混乱的原因之外,这应该是可行的),但结果往往是令人费解的)。(这不适用于tkinter.Tcl();当执行多次和多个线程时,这确实是合理的。它生成的对象是线程绑定的,但是有许多实例是合理的,您可以在它们自己的线程中或在一起拥有这些实例。)

像您所做的那样,对tkinter.Tk()的两个调用是创建两个独立的底层Tcl/Tk环境(技术术语是一个“解释器”,尽管它有一个字节码编译器等等)共享一个线程。从Tcl/Tk的角度来看,这是明智的,因为Tcl使用的安全模型非常不同,但从Python的角度来看,这几乎是一派胡言。其效果可以用小规模的操作来描述,但要更广泛地理解它们是非常困难的,建议您不要尝试。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68792577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档