2017-01-30 4 views
0

Обычно я не могу использовать никакой проблемы wx.GetApp():Почему я не могу использовать WX из дочернего процесса?

>>> import wx 
>>> wx.__version__ 
'2.8.12.0' 
>>> wx.GetApp() 
<wx._core.App; proxy of <Swig Object of type 'wxPyApp *' at 0x67dd690> > 

Однако из подпроцесса wx.GetApp() возвращается None

from multiprocessing import Process 
import wx 

def main(): 
    process = Process(target=target) 
    process.start() 
    process.join() 

def target(): 
    print 'wx.GetApp() = %s' % wx.GetApp() 

Вышеуказанные коды печатают wx.GetApp() = None.

Почему wx не работает то же самое в дочернем процессе?

ответ

1

Поскольку все глобальные данные и общие библиотеки, связанные с wxWidgets, не наследуются дочерним процессом, и поскольку большинство объектов wx действительно обернуты объектами C++. Многопроцессорный модуль Python не может передавать их взад и вперед. Лучшее, что вы можете сделать, это создать новый wx.App и любые другие элементы GUI, необходимые для дочерних процессов. Если родительскому процессу нужен графический интерфейс, тогда было бы лучше отложить его создание до тех пор, пока не будут начаты дочерние процессы, если это возможно.

Если вам просто нужно, чтобы ваши дочерние процессы обновляли или иным образом влияли на основной графический интерфейс родителя и не нуждались в отдельном графическом интерфейсе, тогда это можно сделать так же, как вы могли бы сделать это в одном процессе с несколькими потоками. Детские процессы могут отправлять сообщения в родительский процесс по мере необходимости с чем-то вроде multiprocessing.Queue, и родительский элемент может их поймать и использовать wx.CallAfter для вызова кода, который обновит графический интерфейс.

 Смежные вопросы

  • Нет связанных вопросов^_^