通常我可以使用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
在子进程中的工作方式不同?
答案 0 :(得分:1)
因为与子进程没有继承与wxWidgets相关联的所有全局数据和共享库,并且由于大多数wx对象都是真正包装的C ++对象,因此Python的多进程模块无法将它们传回向前。您可以做的最好的事情是创建一个新的wx.App
以及子进程中所需的任何其他GUI元素。如果父进程需要GUI,那么最好延迟在那里创建它,直到子进程启动后,如果可能的话。
如果您只是需要您的子进程更新或以其他方式影响父级的主GUI并且不需要拥有自己的单独GUI,那么这可以与您在单个GUI中的方式类似地完成多线程的进程。子进程可以根据需要使用类似multiprocessing.Queue
的内容向父进程发送消息,父进程可以捕获它们并使用wx.CallAfter
来调用将更新GUI的代码。