2019年12月27日 / 586次阅读 / Last Modified 2019年12月28日
tkinter,多线程
python标准的GUI库,tkinter,到底是不是线程安全的(threadsafe)?本文给出答案。可以这么说:现在新安装的python,自带的tkinter都是线程安全的,以前的不一定是!
什么是线程安全?
我们可以这么简单的来理解,多个线程访问时,不需要自己显示的做线程同步,模块自己内部已经做了多线程保护,这就是线程安全。比如多个线程都在想Text控件输出内容,如果Text控件不是线程安全,多线程就需要自己做同步,比如加锁解锁这样的操作,而如果Text控件本身就是线程安全的,多线程就不需要这么麻烦了。
线程安全,也可以说成,支持线程!
关于tkinter库是否线程安全,baidu几乎找不到什么有用的信息,看来国人不太关心这个细节。用bing一下子就找到了问题的答案!)、(https://bugs.python.org/issue11077,看最后一个msg;https://bugs.python.org/issue33479)
tkinter模块的基础是tcl/tk,它有两种编译方式,支持线程或不支持线程。tkinter从8.6版本开始,默认的编译方式就是支持线程,即线程安全。
不确定python3从哪个版本开始使用tkinter 8.6版本,我这里3.6.5已经是了。Win系统还有一个判断方法,到python的安装路径中,去找tcl/tk的dll文件,如果右面带一个小t(thread),即是线程安全的。如下图:
Linux下python3,我是编译安装的,编译过程没有修改过tkinter模块的任何参数,默认应该就是线程安全的。
查看你的python中tkinter模块对应的tcl/tk版本号:
>>> import tkinter
>>> tkinter.TclVersion
8.6
>>> tkinter.TkVersion
8.6
python官方也宣称tkinter是线程安全的,https://docs.python.org/3/library/tk.html,第二段的最后一句。
-- EOF --
本文链接:https://www.pynote.net/archives/1643
《tkinter是否线程安全(threadsafe)?》有3条留言
前一篇:tkinter界面因线程join卡死的案例
后一篇:在python中做时间比较
©Copyright 麦新杰 Since 2019 Python笔记
tkinter虽然自身线程安全,但是还是要注意这个问题,tklog就出了这个问题,我的代码自己设置log windows的normal和disabled状态,在多线程的情况下,就出现了log丢失,因为有的线程设置了disable后,别的线程刚好走到insert那里。 [ ]
事实证明,Linux下的图形界面性能不如Windows,虽然都是使用tkinter。 [ ]
网络还能看到很多人使用tkinter root或Toplevel的after方法,配合Queue来实现线程安全的多线程GUI程序。现在完全不需要了,在独立线程中更新widget也不会有什么特别的问题了。 [ ]