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()
。最后一个函数会一直阻塞,直到事件被处理。

因为它们都在两个不同的线程中?