2017-01-30 9 views
0

Normalerweise kann ich wx.GetApp() kein Problem verwenden:Warum kann ich WX nicht aus einem untergeordneten Prozess verwenden?

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

jedoch von einem subprocess wx.GetApp() kehrt 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() 

Die oben genannten Codes druckt wx.GetApp() = None.

Warum funktioniert wx nicht gleich in einem untergeordneten Prozess?

Antwort

1

Da alle globalen Daten und gemeinsam genutzten Bibliotheken, die mit wxWidgets verknüpft sind, nicht vom untergeordneten Prozess geerbt werden und die meisten wx-Objekte wirklich umschlossen sind C++ - Objekte Pythons Multiprozessmodul kann sie nicht vor- und zurückreichen. Das Beste, was Sie tun können, ist ein neues wx.App und alle anderen GUI-Elemente, die in den untergeordneten Prozessen benötigt werden, zu erstellen. Wenn der Parent-Prozess eine GUI benötigt, wäre es besser, die Erstellung dort zu verzögern, bis die Child-Prozesse gestartet wurden, falls möglich.

Wenn Sie lediglich Ihre untergeordneten Prozesse benötigen, um die Haupt-GUI des übergeordneten Elements zu aktualisieren oder anderweitig zu beeinflussen, und keine eigene separate GUI benötigen, kann dies ähnlich wie in einem einzigen Prozess durchgeführt werden mit mehreren Threads. Die untergeordneten Prozesse können nach Bedarf Nachrichten an den übergeordneten Prozess senden, z. B. multiprocessing.Queue, und der übergeordnete Benutzer kann sie abfangen und wx.CallAfter verwenden, um den Code aufzurufen, der die GUI aktualisiert.

Verwandte Themen