2010-12-06 4 views
2

Я пытаюсь реализовать шаблон проектирования Observer с помощью wxPython. У меня есть приложение моделирования, которое вычисляет огромное количество данных в фоновом режиме. Иногда я хотел бы отображать вывод модели в графическом интерфейсе --- это всего лишь сетка квадратов разных цветов. В других случаях мне нужно делать вычисления без отображения графического интерфейса.Шаблон наблюдателя в wxPython

Преимущество шаблона наблюдателя в том, что вы можете подключить или нет графического интерфейса просто путем добавления или удаления одной строки кода, что-то вроде

self.observers.append(MyWxGui()) 

или подобное. Теперь для этого мне нужно, чтобы мои вычисления выполнялись в одном потоке, а 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() работает в основном потоке и чем длинная работа во вторичном потоке, в то время как мне нужно, чтобы это было наоборот. Это связано с тем, что если у меня есть Mainloop() в основном потоке, программа зависает в ожидании какого-либо события из графического интерфейса, а не при продолжении вычислений.

Я также видел, что я не могу манипулировать контекстами устройств (DC), такими как ClientDC или PaintDC, в подпотоке, но я запускаю весь код wx внутри одного потока.

Может ли Mainloop() и весь wx-интерфейс GUI работать в своем потоке, который не является основным приложением?

Запуск wxPython 2.8.11.0 на Ubuntu 10.10 maverick.

+0

Знаете ли вы (не-threaded) реализацию шаблона наблюдателя в (wx) python? Pubsub, как упоминалось ниже, является глобальным издателем-подписчиком, и я еще не нашел шаблон наблюдателя. – virtualnobi 2013-03-27 11:25:32

ответ

3

Если вы прочитали эту страницу wiki, то вам следует знать, что вы можете связаться с wx-потоком, используя wx.CallAfter, wxCallLater или wx.PostEvent в потокобезопасном режиме. У меня есть простой учебник здесь:

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

Лично я хотел бы использовать что-то вроде PubSub + один из методов потоки упомянутых выше для связи с WX MainLoop. Самое приятное в Pubsub заключается в том, что он может слушать сообщения и реагировать на них соответствующим образом. В приведенном выше примере фактически показан один из способов сделать именно это. Надеюсь, это поможет вам. В противном случае, я настоятельно рекомендую присоединиться к списку рассылки wxPython и запросить там: http://groups.google.com/group/wxpython-users/topics?pli=1

+0

Я не думаю, что это отвечает на мой вопрос. С CallAfter и сим. он по-прежнему является графическим интерфейсом, который вызывает модель для продолжения обработки после ее запуска. Моя цель - полностью реализовать шаблон Observer и, следовательно, полностью запустить модель без GUI. Рассмотрим, например, если GUI был отключен (т. Е. Пользователь решает запустить программу без GUI): как модель будет продолжена, если она ждет, когда GUI выдает команду, вызываемую CallAfter? Модель должна знать, что есть, возможно, графический интерфейс, который побеждает идею наблюдателя. – gozzilli 2011-03-20 13:09:45