Шаблон наблюдателя в wxPython - PullRequest
2 голосов
/ 06 декабря 2010

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

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

self.observers.append(MyWxGui())

или аналогичный. Теперь для этого мне нужно, чтобы мои вычисления выполнялись в одном потоке, а графический интерфейс wx - в другом. Я пытался сделать это с wxPython, но я всегда получаю фатальную ошибку ввода-вывода:

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 в своем собственном потоке, отличном от основного приложения?

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

1 Ответ

3 голосов
/ 06 декабря 2010

Если вы читаете эту вики-страницу, то вы должны знать, что вы можете связаться с потоком 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...