线程、wxpython 和状态栏
Posted
技术标签:
【中文标题】线程、wxpython 和状态栏【英文标题】:Threads, wxpython and statusbar 【发布时间】:2011-06-09 05:28:30 【问题描述】:我正在做一个使用 wxStatusBar 的程序,当下载开始时,我会像这样启动一个子线程:
def OnDownload(self, event):
child = threading.Thread(target=self.Download)
child.setDaemon(True)
child.start()
Download 是另一个没有参数的函数(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
【问题讨论】:
【参考方案1】:大多数人会被定向到 wxPython wiki:
http://wiki.wxpython.org/LongRunningTasks
我还在这里写了一篇关于这个主题的小文章:
http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/
不过,我想我以前从未见过您的解决方案。
【讨论】:
【参考方案2】:你是如何更新状态栏的?
我认为如果你创建一个自定义事件应该没问题,然后通过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.
【讨论】:
以上是关于线程、wxpython 和状态栏的主要内容,如果未能解决你的问题,请参考以下文章