在wxPython中,主线程在其他线程工作时应该做什么?

0 投票
3 回答
662 浏览
提问于 2025-04-18 12:29

我有一个点击事件函数,它绑定在一个wx.Button按钮上。当我点击这个按钮时,这个函数就会被执行,它会创建一个线程,然后在后台开始工作。那么在这个线程完成工作的时候,我应该在主线程中做些什么,才能让界面保持响应呢?现在我在主线程中做的是这个:

worker_thread = Thread(target = self.DoWork, name = "Solo Worker Thread")
worker_thread.start()

while worker_thread.is_alive():      
    self.Update() #self being the class that inherits wx.Panel

但是界面还是没有反应。我是不是调用了错误的方法?

3 个回答

1

你不需要做什么。只要长时间运行的过程在一个不同的线程中进行,它就不会阻塞图形界面的主循环。你可以看看以下资源,里面有例子:

如果你查看这些内容,你会发现你可以启动一个线程,而这个线程不会阻塞用户界面。

1

我建议你使用 wx.CallAfter()。你可以在 这里 找到一些有用的例子。此外,你还可以使用 pubsub 模块来给你的图形界面发送消息。这样一来,你的图形界面就不会因为其他线程而卡住了。

这里有一个不错的博客,我在遇到类似问题时读过。你还可以在SO上找到一些其他问题,这些问题可能会帮助你理解这个概念,这里这里,以及 这里

1

你的例子

while worker_thread.is_alive():      
    # do something

会让你的图形界面(GUI)卡住,并且会占用所有可用的CPU资源去询问worker_thread是否还在工作。如果你阻塞了主线程,wxPython似乎就无法更新,即使你强制使用wx.Yield….Update()来更新也不行。

所以,建议你删除while …这个语句。你可以通过以下方法来判断分离出来的线程是否还在运行:

  • 通过在工作线程结束时调用主线程的线程安全的wx.CallAfter来发出信号
  • 安装一个wx.Timer(比如每1000毫秒)来定期检查worker_thread是否还活着

撰写回答