线程、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 和状态栏的主要内容,如果未能解决你的问题,请参考以下文章

wxPython:如何在状态栏中放置额外的小部件?

如何在wxpython中状态栏的特定字段中放置进度条?

wxPython:状态栏不会在 wxToolBar 的长期帮助下更新

python解压缩文件并提供更新到wxPython状态栏

wxpython 创建工具栏和菜单栏

wxPython:一曲MFC的挽歌,理想主义的绝唱