将小部件添加到现有框架并在wxpython中同时显示进度条

时间:2015-12-16 10:01:51

标签: python multithreading user-interface wxpython

我有一个wxpython应用程序,我启动应用程序并显示主框架。它有一个按钮。当我按下按钮时,我希望显示pyprogresswx.lib.agw.pyprogress),并且我希望在pyprogress运行时向主框架添加5个小部件。 pyprogress应该显示如下消息:“添加小部件1”,“添加小部件2”...我尝试在单独的线程中运行pyprogress,但是当我尝试更新{{1消息并同时向主框架添加小部件,我收到此错误:

pyprogress

如何更新PyAssertionError: C++ assertion "wxThread::IsMain()" failed at ..\..\src\msw\evtloop.cpp(182) in wxGUIEventLoop::Dispatch(): only the main thread can process Windows messages 并同时向大型机添加小部件?

更新

以下代码可以正常运行,我不知道它是如何工作的。它从线程更新GUI窗口和PyProgress窗口,我没有得到任何pyprogress。请解释为什么它没有给出任何错误。

only the main thread can process Windows messages

2 个答案:

答案 0 :(得分:0)

您的所有UI代码都必须位于主线程中。一个选项是,将进度条代码移动到主线程中,并与执行实际工作的单独线程进行通信。我通常从单独的线程定义自定义事件和PostEvent。这里有一个关于这个主题的好文章:http://wiki.wxpython.org/LongRunningTasks

答案 1 :(得分:0)

您可以使用wx.lib.pubsubfrom wx.lib.pubsub import pub)来实现此目的 将您的gauge或其他内容放在主循环和

pub.subscribe(self.listener, 'Update-1')
例如,

self.listener是更新gauge的函数,而在您发布的帖子中

pub.sendMessage('Update-1', data1=(a1), data2=(a2), data3=(a3))

消息,只要您想要用来更新进度条的内容发生 监听器功能看起来像这样:

# Sub Pub listener
def listener(self, data1, data2, data3):
    count = int(data1)
    size = int(data2)
    self.progress.SetRange(size)
    self.progress.SetValue(count)
    self.filehandle.SetValue(data3)

UI定义为:

self.progress = wx.Gauge(self.panel, pos=(10,155), size=(300,10),range=100)
self.filehandle = wx.TextCtrl(self.panel,-1, pos=(10,170),size=(300,25), value="")

(此示例用于报告文件下载的进度)