Python3.8 tkinter在使用thread.join()时阻止线程调用Stringvar.get()
我听说Python3.8 tkinter在使用thread.join()时阻止线程调用Stringvar.get(),tkinter,python-multithreading,python-3.8,Tkinter,Python Multithreading,Python 3.8,我听说tkinter不是线程安全的,但我不理解我目前面临的问题。我有一个Python中的tkinterGUI,它有一个tkinter.Stringvarvar,还有一个按钮运行,它构建了一个调用函数fn的线程 import tkinter,threading from time import sleep as Sleep gui=tkinter.Tk() var=tkinter.StringVar(gui) #create a tkinter string variable var.s
tkinter
不是线程安全的,但我不理解我目前面临的问题。我有一个Python中的tkinter
GUI,它有一个tkinter.Stringvar
var
,还有一个按钮运行,它构建了一个调用函数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()
行,则不会出现这种情况。这似乎将代码发送到一个无限循环中
为什么调用线程的
join
方法时线程不能检索tkinter
变量的状态?基于tkinter源代码,get()
向主事件循环发送事件并等待回复
您正在调用get()
并使用join()
阻塞事件循环,因此get()
永远不会完成
您可以在此处查看源代码:
如果搜索源代码,您将看到功能链:
get()
调用globalgetvar()
哪个调用Tkapp\u globalgetvar()
哪个调用var\u invoke()
。最后一个函数会一直阻塞,直到事件被处理。因为它们都在两个不同的线程中?