Python 线程化函数完成后,在主线程中调用函数

Python 线程化函数完成后,在主线程中调用函数,python,python-3.x,tkinter,python-multithreading,Python,Python 3.x,Tkinter,Python Multithreading,我正在构建一个Tkinter GUI,我有一个需要一段时间才能完成的过程,所以我对它进行了线程化,以防止GUI挂起。让我们调用线程函数foo。一旦foo完成,我需要调用另一个函数barbar(它使用的matplotlib方法在线程内部不起作用) 我似乎不知道该怎么做。我想加入线程,但这只会导致GUI挂起。我还考虑使用一个信号变量,我将在foo的最后一行中更改该变量,以告诉我的程序的其余部分它已经完成,以及执行bar的时间,但是我无法弄清楚如何在不挂起GUI的情况下在主线程中连续检查该变量。有什么

我正在构建一个Tkinter GUI,我有一个需要一段时间才能完成的过程,所以我对它进行了线程化,以防止GUI挂起。让我们调用线程函数
foo
。一旦
foo
完成,我需要调用另一个函数
bar
<需要从主线程调用code>bar(它使用的matplotlib方法在线程内部不起作用)

我似乎不知道该怎么做。我想加入线程,但这只会导致GUI挂起。我还考虑使用一个信号变量,我将在
foo
的最后一行中更改该变量,以告诉我的程序的其余部分它已经完成,以及执行
bar
的时间,但是我无法弄清楚如何在不挂起GUI的情况下在主线程中连续检查该变量。有什么想法吗


使用Python 3.7,您可以使用
threading.Event()
对象通知主线程,并使用
after()
定期调用函数,检查
事件()
对象,以确定何时调用
bar()

下面是一个简单的例子:

将tkinter作为tk导入
导入线程
导入时间
def foo(事件):
打印('foo start')
时间。睡眠(5)
打印('foo done')
#通知主线程
event.set()
def bar():
打印('你好')
def检查_事件(事件,回调):
打印('.',结束='')
如果event.is_set():
#线程任务已完成
回调函数()
其他:
#100毫秒后再次检查(调整此项以适合您的情况)
root.after(100,检查事件,事件,回调)
root=tk.tk()
#创建`Event()`对象
event=threading.event()
#开始检查
检查_事件(事件、条)
#启动线程任务
threading.Thread(target=foo,args=(event,).start()
root.mainloop()

您可以使用
threading.Event()
对象通知主线程,并使用
after()
定期调用函数以检查
事件()
对象以确定何时调用
条()

下面是一个简单的例子:

将tkinter作为tk导入
导入线程
导入时间
def foo(事件):
打印('foo start')
时间。睡眠(5)
打印('foo done')
#通知主线程
event.set()
def bar():
打印('你好')
def检查_事件(事件,回调):
打印('.',结束='')
如果event.is_set():
#线程任务已完成
回调函数()
其他:
#100毫秒后再次检查(调整此项以适合您的情况)
root.after(100,检查事件,事件,回调)
root=tk.tk()
#创建`Event()`对象
event=threading.event()
#开始检查
检查_事件(事件、条)
#启动线程任务
threading.Thread(target=foo,args=(event,).start()
root.mainloop()

在主线程中调用函数没有意义-函数不是那样的“in”线程。在主线程中调用函数没有意义-函数不是那样的“in”线程。