wxpython 使用threading调取后台selenium还是会让主界面无响应,请问如何解决?请给出示例
时间: 2024-06-10 10:04:00 浏览: 155
创建一个消息框-rtl8196e系列规格书
解决这个问题的方法是使用 wxPython 的 wx.CallAfter() 函数将后台线程的任务发送到主线程,从而避免对主管程造成卡顿。
具体代码如下:
```
import wx
import threading
from selenium import webdriver
class MyFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, title="My App")
panel = wx.Panel(self)
self.status_label = wx.StaticText(panel, label="Status: Waiting...")
self.start_button = wx.Button(panel, label="Start")
self.stop_button = wx.Button(panel, label="Stop", enabled=False)
self.start_button.Bind(wx.EVT_BUTTON, self.start_thread)
self.stop_button.Bind(wx.EVT_BUTTON, self.stop_thread)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.status_label, wx.EXPAND|wx.TOP|wx.LEFT|wx.RIGHT, 10)
sizer.Add(self.start_button, wx.CENTER|wx.TOP|wx.BOTTOM, 10)
sizer.Add(self.stop_button, wx.CENTER|wx.BOTTOM, 10)
panel.SetSizer(sizer)
self.thread = None
self.driver = None
def start_thread(self, event):
self.start_button.Disable()
self.stop_button.Enable()
self.thread = threading.Thread(target=self.do_work)
self.thread.start()
def stop_thread(self, event):
if self.driver:
self.driver.quit()
self.thread.join()
self.start_button.Enable()
self.stop_button.Disable()
self.status_label.SetLabel("Status: Stopped")
def do_work(self):
# Open the browser and do some work
self.driver = webdriver.Chrome()
self.driver.get("https://www.google.com")
self.status_label.SetLabel("Status: Working...")
# Call a function to return control to the main thread
wx.CallAfter(self.on_work_done)
def on_work_done(self):
self.driver.quit()
self.start_button.Enable()
self.stop_button.Disable()
self.status_label.SetLabel("Status: Done")
if __name__ == "__main__":
app = wx.App()
frame = MyFrame(None)
frame.Show(True)
app.MainLoop()
```
这段代码创建了一个简单的 GUI 界面,其中包含一个“开始”按钮和一个“停止”按钮,用于启动和停止后台线程。在后台线程中,我们使用 Selenium 的 Chrome 浏览器驱动程序打开谷歌主页。在工作完成后,我们使用 wx.CallAfter() 函数调用 on_work_done() 方法,将程序控制权返回给主线程。
通过这个程序的实例,我们可以看到如何使用 wxPython 和 threading 模块创建一个基于 Selenium 的多线程 GUI 应用程序。
阅读全文