tkinter是否线程安全(threadsafe)?

2019年12月27日 / 186次阅读 / 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),即是线程安全的。如下图:

tcl/tk8.6线程安全版
tcl/tk8.6线程安全版

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虽然自身线程安全,但是还是要注意这个问题,tklog就出了这个问题,我的代码自己设置log windows的normal和disabled状态,在多线程的情况下,就出现了log丢失,因为有的线程设置了disable后,别的线程刚好走到insert那里。 [回复]

  • 麦新杰

    事实证明,Linux下的图形界面性能不如Windows,虽然都是使用tkinter。 [回复]

  • 麦新杰

    网络还能看到很多人使用tkinter root或Toplevel的after方法,配合Queue来实现线程安全的多线程GUI程序。现在完全不需要了,在独立线程中更新widget也不会有什么特别的问题了。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top