2010-12-06 77 views
2

我想用wxPython实现Observer设计模式。 我有一个建模应用程序,在后台计算海量数据。有时我想在GUI中显示模型的输出---这只是一个不同颜色的方格。其他时候我需要做计算而不显示GUI。wxPython中的观察者模式

观察者模式的好处是,你可以通过添加或删除一行代码,像

self.observers.append(MyWxGui()) 

或类似的或不是一个GUI插件。 现在,要做到这一点,我需要我的计算在一个线程上运行,而wx GUI将运行在另一个线程上。 我试图与wxPython的这样做,但我总是得到一个致命I/O错误:

python: Fatal IO error 11 (Resource temporarily unavailable) on X server :0.0. 

我读了在wxPython中多线程教程,如http://wiki.wxpython.org/LongRunningTasks,但它们都具有主循环()在主线程中运行而不是在辅助线程中长时间运行的任务,而我需要的是相反的方式。这是因为如果我在主线程中拥有Mainloop(),程序会挂起等待GUI中的某个事件,而不是继续计算。

我还看到我无法在子线程中操作DeviceDC或PaintDC等设备上下文(DC),但我在同一线程中运行了整个wx代码。

Mainloop()和所有的wx GUI能够在它自己的线程中运行吗?它不是主应用程序的线程吗?

在Ubuntu 10.10 maverick上运行wxPython 2.8.11.0。

+0

您是否知道(wx)python中的observer模式的实现(非线程)?如下所述,Pubsub是全球的发布者订阅者的事情,我还没有找到实现的观察者模式。 – virtualnobi 2013-03-27 11:25:32

回答

3

如果您阅读了该wiki页面,那么您应该知道可以使用wx.CallAfter,wxCallLater或wx.PostEvent以线程安全的方式与wx线程进行通信。我有一个简单的教程在这里:

http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/

就个人而言,我会使用类似上面提到的与WX MainLoop语句沟通的线程方法PubSub的+之一。 Pubsub的好处在于它可以侦听消息并对其作出适当的反应。上面的例子实际上显示了一种方法来做到这一点。希望这会帮助你。否则,我强烈建议加入wxPython邮件列表并询问:http://groups.google.com/group/wxpython-users/topics?pli=1

+0

我不认为这回答我的问题。随着CallAfter和SIM卡。它仍然是调用模型的GUI在开始后继续处理。我的目标是完全实现Observer模式,并因此让模型完全在没有GUI的情况下运行。例如,考虑GUI是否被禁用(即用户决定不使用GUI来运行该程序):如果模型正在等待GUI发出由CallAfter调用的命令,模型将如何继续?该模型必须意识到,可能存在一个GUI,它违背了观察者的想法。 – gozzilli 2011-03-20 13:09:45