线程、wxpython和状态栏

4 投票
2 回答
1347 浏览
提问于 2025-04-16 09:58

我正在做一个程序,里面用到了wxStatusBar。当下载开始时,我会像这样启动一个子线程:

def OnDownload(self, event):
    child = threading.Thread(target=self.Download)
    child.setDaemon(True)
    child.start()

下载是另一个没有参数的函数(除了self)。我想在这个函数里更新状态栏,显示一些下载进度的信息,但每当我尝试这样做时,常常会出现Xwindow、glib和段错误(segfaults)这样的错误。有没有什么办法解决这个问题?

解决办法:我只需要在线程中更改GUI之前,先调用wx.MutexGuiEnter(),然后在完成后调用wx.MutexGuiLeave()。比如:

def Download(self):
    #stuff that doesn't affect the GUI
    wx.MutexGuiEnter()
    self.SetStatusText("This is a thread")
    wx.MutexGuiLeave()

就这样 :D

2 个回答

1

大多数人会被引导到wxPython的维基百科页面:

http://wiki.wxpython.org/LongRunningTasks

我也在这里写了一些关于这个主题的内容:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

不过,我觉得我从来没有见过你提到的解决方案。

0

你是怎么更新状态栏的?

我觉得如果你创建一个自定义事件,然后通过 wx.PostEvent 来发送这个事件,以通知图形界面中的框架或状态栏,那应该没问题。

如果你想在状态栏中显示下载进度,你可以让你的事件看起来像这样:

DownloadProgressEvent, EVT_DL_PROGRESS = wx.lib.newevent.NewEvent()

# from the thread...

event = DownloadProgressEvent(current=100, total=1000, filename="foo.jpg")
wx.PostEvent(frame, event)

# from the frame:

def OnDownloadProgress(self, event):
    self.statusbar.update_dl_msg(event.current, event.total, event.filename)

这里有一些来自wxPython维基的详细信息。

撰写回答