如何解决Python3.8 tkinter在使用thread.join时阻止线程调用Stringvar.get
我听说tkinter
不是线程安全的,但是我不明白我当前面临的问题。我在Python中有一个tkinter
GUI,它有一个tkinter.Stringvar
var
和一个按钮 Run ,它建立了一个调用函数fn
的线程。
import tkinter,threading
from time import sleep as Sleep
gui=tkinter.Tk()
var=tkinter.StringVar(gui) #create a tkinter string variable
var.set('Hello')
def print_sequence():
current_var=var.get()
print(current_var)
def run(): #build thread and start
thread=threading.Thread(target=fn)
thread.start()
# thread.join()
print('Done!')
def fn():
print(var.get())
Sleep(2)
print('done fn')
add_btn=tkinter.Button(gui,text='Run',command=run)
add_btn.grid(column=2,row=1)
gui.mainloop()
按 Run 按钮时,运行上述代码将按预期返回“ Hello”。但是,如果您取消注释thread.join()
行,则不会这样。这似乎会将代码发送到一个无限循环中。
为什么调用线程的tkinter
方法时线程不能检索join
变量的状态?
解决方法
基于{t1inter}源代码,get()
将事件发送到主事件循环并等待答复。
您正在呼叫get()
并使用join()
阻止事件循环,因此get()
永远不会完成。
您可以在此处检查源代码: https://github.com/python/cpython/tree/master/Lib/tkinter/
如果您搜索源代码,则会看到功能链:
get()
呼叫globalgetvar()
,后者呼叫Tkapp_GlobalGetVar()
,后者呼叫var_invoke()
。最终功能将一直阻塞,直到事件被处理为止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。