tkinter程序的所有窗口,都在一个线程里

2020年1月6日 / 116次阅读 / Last Modified 2020年1月6日
tkinter多线程

理清了一个细节,我们用tkinter做GUI程序(tkinter是python标准的GUI库),有root(调用mainloop的),有Toplevel,可能界面上有好多不同的窗口。这些不同的窗口,都属于一个程序,而且,这些不同的窗口,都在一个线程中!

比如python主线程创建了root窗口,还有一个没有做grab_set的Toplevel的窗口,此时你可以在此Toplevel窗口中操作,也可以同时在root窗口中操作,因为没有锁定焦点(grab_set)。如果此时,你的程序在Toplevel中阻塞了,你会发现root窗口也无法操作了!这就证明他们在一个线程中,他们一起被阻塞了!

有一个方法可以使得同一个程序的不同窗口独立,即在不同的线程中创建不同的root窗口!下面的代码,就是在3个线程中各自创建一个root窗口:

$ cat mgui.py


import tkinter as tk
import threading


def create(lbStr):
    root = tk.Tk()
    lb = tk.Label(root, text=lbStr)
    lb.pack()
    root.mainloop()


for i in range(3):
    tt = threading.Thread(target=create, args=(str(i)*5,))
    tt.start()

运行起来后,这个程序就有3个root窗口,可以各自承载不同的其它功能块。注意上面这段程序创建的线程没有设置daemon=True,就是不能设置,具体请参数python线程的daemon属性

-- EOF --

本文链接:https://www.pynote.net/archives/1734

留言区

《tkinter程序的所有窗口,都在一个线程里》有4条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    这一个线程,就是处理事件的mainloop,它只能一个一个的处理事件,一个事件的处理如果没有返回,下一个就不能开始。Toplevel窗口的事件,也在这个mainloop里面。 [回复]

  • 麦新杰

    计算机的一个核心思想:机制和策略分离。其实,用户的使用也是一个策略,有的时候软件不需要太过于纠结如何去限制用户的使用。 [回复]

  • 麦新杰

    经测试,也没有必要在线程中创建Toplevel窗口! [回复]

  • 麦新杰

    【用tkinter在一个程序中创建多个根root窗口不是一个好的设计】Tkinter只是一个嵌入式Tcl解释器的python包装器,可以导入Tk库。创建根窗口时,将创建Tcl解释器的实例。每个Tcl解释器都是一个独立的沙箱。一个沙箱中的对象无法与另一个沙箱中的对象进行交互。最常见的表现是StringVar在一个解释器中创建的,在另一个解释器中不可见。小部件也是如此 - 您无法在一个解释器中创建小部件,该解释器在另一个解释器中具有父小部件。最佳解决方案99.9%的时间是创建一个Tk用于程序生命周期的实例。很简单,这就是tkinter和底层Tcl / Tk解释器的设计使用方式。 从技术角度来看,没有理由不能同时拥有两个实例Tk。反对它的建议是因为很少有实际需要有两个或更多不同的Tcl解释器,并且它会导致初学者难以掌握的问题。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top