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

时间:2017-01-30 15:35:24

标签: python wxpython

通常我可以使用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()返回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 个答案:

答案 0 :(得分:1)

因为与子进程没有继承与wxWidgets相关联的所有全局数据和共享库,并且由于大多数wx对象都是真正包装的C ++对象,因此Python的多进程模块无法将它们传回向前。您可以做的最好的事情是创建一个新的wx.App以及子进程中所需的任何其他GUI元素。如果父进程需要GUI,那么最好延迟在那里创建它,直到子进程启动后,如果可能的话。

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