为什么我不能在子进程中使用 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 的代码。
正常我可以用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 的代码。