2016-08-04 81 views
0

Mein Problem ist wie folgt:WxPython Rückgabewert von Assistenten Rahmen Aufruf

Ich bin der Gestaltung eines Assistenten für den Bau eines Objekts zu einer Liste von Objekten in der anrufenden Rahmen meines Programms hinzugefügt werden. Am Ende des Assistenten möchte ich das neu erstellte Objekt an den aufrufenden Rahmen zurückgeben, der in die Liste eingefügt werden soll. Um diese Grundfunktionalität auf einer abstrakten Basis zu simulieren habe ich folgendes konstruiert, abgespeckte App:

mainframe.py

import wx 
import wiz_test 
class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self,None,title="Main") 
     panel = wx.Panel(self) 
     callButton = wx.Button(panel, label = "Call Wizard") 
     callButton.Bind(wx.EVT_BUTTON,self.launchWizard) 
     self.Show() 
    def launchWizard(self,event): 
     wiz = wiz_test.WizObj(self) 
     a = 0 
     if wiz == wx.wizard.EVT_WIZARD_FINISHED: 
      a = wiz.answer 
     print a 

if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MainFrame() 
    app.MainLoop() 

wiz_test.py

import wx 
import wx.wizard as wiz 

class WizPage(wiz.WizardPageSimple): 
    def __init__(self, parent): 
     self.answer = 3 
     wiz.WizardPageSimple.__init__(self, parent) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 

     title = wx.StaticText(self, -1, "Wizard Page") 
     title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) 

     sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5) 
     sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5) 


class WizObj(object): 
    def __init__(self,parent): 
     wizard = wx.wizard.Wizard(None, -1, "Simple Wizard") 
     page1 = WizPage(wizard) 
     wizard.FitToPage(page1) 
     wizard.RunWizard(page1) 
     wizard.Destroy() 

if __name__ == "__main__": 
    app = wx.App(False) 
    main() 
    app.MainLoop() 

Das ultimative Ziel in dieser Ein kleines Beispiel besteht darin, die MainFrame-Instanz dazu zu bringen, den Wert '3' auszugeben, der von der .answer-Membervariablen der WizObj-Instanz stammt, wenn das Ereignis 'wx.wizard.EVT_WIZARD_FINISHED' ausgelöst wird. Es funktioniert jedoch zu diesem Zeitpunkt eindeutig nicht, da der aktuelle Code nur '0' zurückgibt. Nähme ich mich dem richtigen Weg? Sollte ich stattdessen das EVT_WIZARD_FINISHED-Ereignis binden, und wenn ja, wie würde ich von Mainframe darauf zugreifen?

Antwort

0

Ich konnte dieses Problem durch die Verwendung der "Pubsub" -Funktion innerhalb der WxPython-Bibliothek lösen. Insbesondere habe ich eine pubscript() - Instanz unmittelbar vor der Instanziierung meines Assistenten innerhalb des Aufrufrahmens hinzugefügt. Innerhalb des Assistenten übergebe ich den Wert über pub.sendMessage() kurz vor dem Zerstören des Assistenten. Es ist wichtig zu beachten, dass der Pass-Wert angegeben werden musste, damit der Pubsub-Send effektiv funktioniert.

Der folgende Code ist die modifizierte Version des ursprünglichen Codes, der jetzt funktioniert.

MainFrame.py

import wx 
import wiz_test 
from wx.lib.pubsub import pub 

class MainFrame(wx.Frame): 
    def __init__(self): 
     wx.Frame.__init__(self,None,title="Main") 
     panel = wx.Panel(self) 
     callButton = wx.Button(panel, label = "Call Wizard") 
     callButton.Bind(wx.EVT_BUTTON,self.launchWizard) 
     self.Show() 

    def catch_stuff(self,a): 
     print a 

    def launchWizard(self,event): 
     pub.subscribe(self.catch_stuff,'valPass') 
     wiz = wiz_test.WizObj(self,a) 



if __name__ == '__main__': 
    app = wx.App(False) 
    frame = MainFrame() 
    app.MainLoop() 

wiz_test.py

import wx 
import wx.wizard as wiz 
from wx.lib.pubsub import pub 

class WizPage(wiz.WizardPageSimple): 
    def __init__(self, parent): 
     self.answer = 3 
     wiz.WizardPageSimple.__init__(self, parent) 

     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 

     title = wx.StaticText(self, -1, "Wizard Page") 
     title.SetFont(wx.Font(18, wx.SWISS, wx.NORMAL, wx.BOLD)) 


     sizer.Add(title, 0, wx.ALIGN_CENTRE|wx.ALL, 5) 
     sizer.Add(wx.StaticLine(self, -1), 0, wx.EXPAND|wx.ALL, 5) 

#---------------------------------------------------------------------- 
class WizObj(object): 
    def __init__(self,parent,a): 
     wizard = wx.wizard.Wizard(None, -1, "Simple Wizard") 
     page1 = WizPage(wizard) 
     wizard.FitToPage(page1) 
     wizard.RunWizard(page1) 
     pub.sendMessage('valPass',a = page1.answer) 
     wizard.Destroy() 

#---------------------------------------------------------------------- 
if __name__ == "__main__": 
    app = wx.App(False) 
    main() 
    app.MainLoop() 

Das Ergebnis ist, dass die Konsole gibt den Wert , die aus dem genannten Assistenten abgerufen wurde.