tkinter mainloop()机制疑问:单实例调用为何能处理多窗口事件
Tkinter mainloop()工作原理纠正
原有认知的错误之处
你之前的理解核心偏差在于:mainloop()的处理范围从来不是和单个组件、单个Tk实例绑定,而是和当前线程的全局事件队列绑定。
正确的运行逻辑
- 每实例化一个
Tk()对象,确实会创建一个独立的Tcl解释器,每个解释器独立维护自己的组件树、变量、资源上下文,不同解释器的资源无法互通 - 但所有在同一线程内创建的Tk实例,产生的事件都会投递到当前线程的全局事件队列中
- 不管调用的是
tkinter.mainloop(),还是任意组件的<widget>.mainloop(),本质都是启动当前线程的事件循环,遍历处理队列里该线程下所有Tk实例的所有事件,这就是你代码中调用root1.mainloop()时,root2窗口也能正常响应操作的原因
开发建议
普通场景下不要在单个进程里创建多个Tk()实例,很容易出现资源泄漏、事件逻辑异常的问题。如果需要多窗口,应该使用Toplevel组件,所有窗口共享同一个根Tk()实例的解释器,仅启动一次主事件循环即可。
内容的提问来源于stack exchange,提问作者Delrius Euphoria
相关产品推荐
相关产品推荐

