首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >wxpython --线程和窗口事件

wxpython --线程和窗口事件
EN

Stack Overflow用户
提问于 2009-09-30 04:16:27
回答 2查看 2.4K关注 0票数 4

我有一个wxPython应用程序(http://www.OpenSTV.org),它使用具有多轮的方法来计算选票。我想做两件事:

(1)对于大量的选票,这可能会有点慢,所以我想向用户显示一个进度对话框,这样他就不会认为应用程序被冻结了。

(2)我希望允许用户手动打破平局,这需要计数代码显示一个对话框窗口。

为了实现(1),我创建了一个线程来运行计数代码,这允许我向用户显示一个很好的进度对话框。

然而,这样做的问题是计数代码不是主线程,并且只有wxPython中的主线程可以处理窗口事件。

我想我可以创建一个线程来运行进度对话框,但这似乎很笨拙。有没有更好的方法来同时完成(1)和(2)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-09-30 04:38:30

使用Queue在线程之间进行通信和同步,每个线程“拥有”并以独占方式与不方便共享的资源交互。

在只有主线程才能真正处理GUI的GUI工具包中,主线程应该配合工作--设置并启动执行实际工作的线程,然后只做GUI工作,使用队列与其他线程进行通信。

对于(1),当您的计数线程有更新时,它应该将其put到主线程正在等待的队列中;当您的主线程在该队列上获得合适的消息时,它会更新进度对话框。

对于(2),计数线程发送“让用户打破平局”请求,主线程获取该请求并做出适当响应,然后在单独的队列中发回解析。

因此,一般来说,有两种类型的通信:一种不需要响应,另一种需要响应。对于前一种情况,只需将通知放在适当的队列中,然后简单地继续--它将在适当的时候执行。对于后一种类型,我最喜欢的习惯用法是在适当的队列上放置一对(request,response_queue)。如果相同的请求不同之处在于有些请求需要响应,而其他请求不需要响应,那么当不需要响应时排队(request,None) (和(request,q)其中q是需要响应时的队列)也是一个很好的、简单的通用习惯用法。

票数 5
EN

Stack Overflow用户

发布于 2009-09-30 04:32:09

有几种方法可以从进程线程调用主线程wxPython线程。最简单的是wx.CallAfter(),它总是在主线程中执行传递给它的函数。你也可以使用wx.PostEvent(),在演示中有一个例子(标记为:线程),还有几种更复杂但更可定制的方法,在wxPython in Action的最后一章中讨论了这些方法。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1496092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档