wxpython点击按钮使用Thread调用函数时无法保持主界面活跃,请问如何解决,请给出示例
时间: 2024-05-05 15:19:34 浏览: 7
您好!关于您提出的问题,可以通过以下示例代码解决:
```python
import wx
import threading
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='wxPython Thread Example')
panel = wx.Panel(self)
self.button = wx.Button(panel, label='Click me!')
self.button.Bind(wx.EVT_BUTTON, self.onClick)
self.status_text = wx.StaticText(panel, label='status: idle')
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.button, 0, wx.ALL, 5)
sizer.Add(self.status_text, 0, wx.ALL, 5)
panel.SetSizer(sizer)
def onClick(self, event):
self.status_text.SetLabel('status: running')
# create a new thread to run the function in the background
thread = threading.Thread(target=self.longRunningFunction)
thread.start()
def longRunningFunction(self):
# simulate some long running task
import time
time.sleep(5)
# update the UI in the main thread
wx.CallAfter(self.updateUI, 'status: finished')
def updateUI(self, message):
self.status_text.SetLabel(message)
if __name__ == '__main__':
app = wx.App(False)
frame = MyFrame()
frame.Show()
app.MainLoop()
```
该示例包括一个 `wx.Frame`,其中包含一个按钮和一个文本标签。按钮绑定到 `onClick` 方法,该方法会启动一个新的线程来运行 `longRunningFunction`。 `longRunningFunction` 模拟一些长时间运行的任务,并在完成后使用 `wx.CallAfter()` 方法来更新UI。
在这种方法中,GUI的主线程负责更新UI,而耗时的任务在后台线程中运行,这样就可以保持主界面的活跃性了。
希望您能够喜欢这个解决方案!