我有一个wxpython应用程序,我启动应用程序并显示主框架。它有一个按钮。当我按下按钮时,我希望显示pyprogress
(wx.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
答案 0 :(得分:0)
您的所有UI代码都必须位于主线程中。一个选项是,将进度条代码移动到主线程中,并与执行实际工作的单独线程进行通信。我通常从单独的线程定义自定义事件和PostEvent。这里有一个关于这个主题的好文章:http://wiki.wxpython.org/LongRunningTasks
答案 1 :(得分:0)
您可以使用wx.lib.pubsub
(from 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="")
(此示例用于报告文件下载的进度)