Python - 运行 上一个线程完成后下一个线程
Python - Run next thread when the previous one is finished
我正在编写一个 tkinter 应用程序。
我想使用线程来避免 tkinter window 冻结,但实际上我没有找到解决方案。
我的代码的一小部分(简化):
from threading import Thread
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
search_button = tk.Button(self, text='Print', command=self.Running)
search_button.grid(row=0, column=0)
def funct1(self):
print('One')
def funct2(self):
print('Two')
def CreateThread(self, item):
self.item = item
t = Thread(target=self.item)
t.start()
def Running(self):
self.CreateThread(self.funct1)
# How to wait for the end of self.CreateThread(self.funct1) ?
self.CreateThread(self.funct2)
if __name__ == '__main__':
myGUI = App()
myGUI.mainloop()
如何等待 self.CreateThread(self.funct1)
在 运行 self.CreateThread(self.funct2)
之前结束。
有队列吗?
还有别的吗?
我已经看过 Thread.join() 但它冻结了 tkinter window.
希望你能帮助我:)
您可以使用 locks
同步线程。在不知道这些线程需要做什么的情况下很难给出具体的答案。但是,锁可能会解决您的问题。这是关于同步线程的 article。
IMO 你应该以不同的方式思考“线程”的含义。线程不是您 运行 的东西。线程是 运行 代码的东西。您有两个 任务(即需要完成的事情),并且您希望按顺序执行这些任务(即一个接一个)。
按顺序执行操作的最佳方法是在同一个线程中执行它们。为什么不创建一个 单个 线程,而不是创建两个单独的线程,首先调用 funct1()
然后调用 funct2()
?
def thread_main(self):
funct1()
funct2()
def Running(self):
Threead(target=self.thread_main).start()
P.S.: 这可能是一个错误:
def CreateThread(self, item):
self.item = item
t = Thread(target=self.item)
t.start()
问题是,两个线程都将分配和使用相同的 self.item
属性,第一个线程写入的值可能会在第一个线程之前被第二个线程覆盖线程开始使用它。为什么不简单地这样做呢?
def CreateThread(self, item):
Thread(target=item).start()
或者,既然函数体减少到一行,显然创建并启动了一个线程,为什么还要费心去定义 CreateThread(...)
?
我正在编写一个 tkinter 应用程序。 我想使用线程来避免 tkinter window 冻结,但实际上我没有找到解决方案。
我的代码的一小部分(简化):
from threading import Thread
import tkinter as tk
class App(tk.Tk):
def __init__(self):
super().__init__()
search_button = tk.Button(self, text='Print', command=self.Running)
search_button.grid(row=0, column=0)
def funct1(self):
print('One')
def funct2(self):
print('Two')
def CreateThread(self, item):
self.item = item
t = Thread(target=self.item)
t.start()
def Running(self):
self.CreateThread(self.funct1)
# How to wait for the end of self.CreateThread(self.funct1) ?
self.CreateThread(self.funct2)
if __name__ == '__main__':
myGUI = App()
myGUI.mainloop()
如何等待 self.CreateThread(self.funct1)
在 运行 self.CreateThread(self.funct2)
之前结束。
有队列吗?
还有别的吗?
我已经看过 Thread.join() 但它冻结了 tkinter window.
希望你能帮助我:)
您可以使用 locks
同步线程。在不知道这些线程需要做什么的情况下很难给出具体的答案。但是,锁可能会解决您的问题。这是关于同步线程的 article。
IMO 你应该以不同的方式思考“线程”的含义。线程不是您 运行 的东西。线程是 运行 代码的东西。您有两个 任务(即需要完成的事情),并且您希望按顺序执行这些任务(即一个接一个)。
按顺序执行操作的最佳方法是在同一个线程中执行它们。为什么不创建一个 单个 线程,而不是创建两个单独的线程,首先调用 funct1()
然后调用 funct2()
?
def thread_main(self):
funct1()
funct2()
def Running(self):
Threead(target=self.thread_main).start()
P.S.: 这可能是一个错误:
def CreateThread(self, item):
self.item = item
t = Thread(target=self.item)
t.start()
问题是,两个线程都将分配和使用相同的 self.item
属性,第一个线程写入的值可能会在第一个线程之前被第二个线程覆盖线程开始使用它。为什么不简单地这样做呢?
def CreateThread(self, item):
Thread(target=item).start()
或者,既然函数体减少到一行,显然创建并启动了一个线程,为什么还要费心去定义 CreateThread(...)
?