当您将新线程加入主线程时,它将等待直到线程完成,因此即使您正在使用多线程,GUI也会阻塞。
如果要将逻辑部分放在其他类中,则可以直接将Thread子类化,然后在按下按钮时启动该类的新对象。Thread的此子类的构造函数可以接收Queue对象,然后您就可以与GUI部件进行通信。所以我的建议是:
- 在主线程中创建一个队列对象
- 创建一个可以访问该队列的新线程
- 定期检查主线程中的队列
然后,您必须解决以下问题:如果用户两次单击同一按钮两次(每次单击都会产生一个新线程),但是可以通过禁用开始按钮并在调用后再次启用它来解决此问题self.prog_bar.stop()。
import Queueclass GUI: # ... def tb_click(self): self.progress() self.prog_bar.start() self.queue = Queue.Queue() ThreadedTask(self.queue).start() self.master.after(100, self.process_queue) def process_queue(self): try: msg = self.queue.get(0) # Show result of the task if needed self.prog_bar.stop() except Queue.Empty: self.master.after(100, self.process_queue)class ThreadedTask(threading.Thread): def __init__(self, queue): threading.Thread.__init__(self) self.queue = queue def run(self): time.sleep(5) # Simulate long running process self.queue.put("Task finished")


