wxpython——线程和窗口事件

wxpython——线程和窗口事件,python,events,multithreading,wxpython,window,Python,Events,Multithreading,Wxpython,Window,我有一个wxPython应用程序(),它使用具有多轮的方法计算选票。我想做两件事: (1) 对于大量选票,这可能有点慢,所以我想向用户显示一个进度对话框,这样他就不会认为应用程序被冻结了 (2) 我希望允许用户手动断开连接,这需要计数代码显示一个对话框窗口 为了实现(1),我创建了一个线程来运行计数代码,这允许我向用户展示一个很好的进度对话框 然而,问题是计数代码不是主线程,只有wxPython中的主线程可以处理窗口事件 我想我可以创建一个线程来运行进度对话框,但是这看起来很尴尬。有没有更好的方

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

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

(2) 我希望允许用户手动断开连接,这需要计数代码显示一个对话框窗口

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

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


我想我可以创建一个线程来运行进度对话框,但是这看起来很尴尬。有没有更好的方法来完成(1)和(2)?

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

用于在线程之间通信和同步,每个线程都“拥有”并且只与不便于共享的资源进行交互

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

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

对于(2),计数线程发送“have the user break a tie”请求,主线程获取该请求并做出相应响应,然后在单独的队列上发回解析


所以一般来说,有两种交流方式:一种不需要回复,另一种需要回复。对于前一种,只需将通知放在适当的队列中,然后简单地继续——它将在适当的时候执行。对于后一种,我最喜欢的习惯用法是在适当的队列中放置一对(请求、响应和队列)。如果在其他方面相同的请求不同,有些需要响应,有些不需要响应,那么在不需要响应时排队(request,None)(和(request,q),其中q是需要响应时的队列)也是一个很好的、简单的、通用的习惯用法。

我看到了如何让我在主线程中执行打破僵局的对话框,但是这两个线程中的任何一个都允许主线程与计数线程通信吗?计数线程需要知道用户是如何打破领带的,然后才能继续。也许我需要一个队列。wx.CallAfter()调用的任何函数都可以直接调用thread对象中的方法或修改属性。