为什么我不能在子进程中使用 WX?

Why can't I use WX from a child process?

正常我可以用wx.GetApp()没问题:

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

但是,从子进程 wx.GetApp() returns 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 在子进程中的工作方式不同?

因为所有与 wxWidgets 关联的全局数据和共享库都没有被子进程继承,而且由于大多数 wx 对象实际上是包装的 C++ 对象 Python 的多进程模块无法来回传递它们。您能做的最好的事情就是创建一个新的 wx.App 和子进程中所需的任何其他 GUI 元素。如果父进程需要 GUI,那么最好在子进程启动之后再在那里创建它,如果可能的话。

如果您只需要您的子进程更新或以其他方式影响父进程的主 GUI,而不需要拥有它们自己单独的 GUI,那么这可以类似于您在单个进程中完成的方式来完成多线程处理。子进程可以根据需要向父进程发送消息,如 multiprocessing.Queue,父进程可以捕获它们并使用 wx.CallAfter 调用将更新 GUI 的代码。