线程,wxpython和状态栏

时间:2011-01-14 15:33:04

标签: python multithreading wxpython statusbar

我正在做一个我正在使用wxStatusBar的程序,当下载开始时我开始这样的子线程:

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

下载是另一个没有参数的功能(自我除外)。我想从那里更新我的状态栏,其中包含有关下载进度的一些信息,但是当我尝试这样做时,我经常会遇到Xwindow,glib和segfaults错误。有什么想法解决这个问题吗?

已解决:我只需要在更改线程内部GUI中的内容和wx.MutexGuiLeave()完成之前包含wx.MutexGuiEnter()。例如

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

这就是全部:D

2 个答案:

答案 0 :(得分:1)

大多数人都被定向到wxPython wiki:

http://wiki.wxpython.org/LongRunningTasks

我还在这里写了一篇关于这个主题的文章:

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

我认为我以前从未见过你的解决方案。

答案 1 :(得分:0)

您如何更新状态栏?

我认为如果您创建自定义事件,然后通过wx.PostEvent发布它以通知GUI线程中的框架/状态栏,您应该没问题。

对于状态栏中的下载进度,您可能希望事件看起来像这样:

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)

Here's some more detail from the wxPython wiki.