2016-07-29 6 views
0

Ich habe an der Entwicklung eines wxPython-basierten Assistenten gearbeitet, dessen Größe ich dynamisch anhand der Eingaben im Assistenten erhöhen könnte. Dieser Assistent durchläuft eine Reihe von Seiten und fordert den Benutzer dann zur Eingabe einer Nummer auf. Das Ziel ist, dass der Assistent dann um die Zahleneingabe in der txtCtrl-Box erhöht wird. Ich habe Probleme beim Zugriff auf die Liste pageList innerhalb der Wizard-Klasse, die für die Verwaltung der Top-Level-Aspekte des Wizards zuständig ist. Mit dem folgenden Code:wxPython fügt dem Assistenten dynamisch Seiten hinzu

import wx 
import wx.wizard as wiz 

######################################################################## 


#---------------------------------------------------------------------- 
# Wizard Object which contains the list of wizard pages. 
class DynaWiz(object): 
    def __init__(self): 
     wizard = wx.wizard.Wizard(None, -1, "Simple Wizard") 
     self.pageList = [TitledPage(wizard, "Page 1"), 
        TitledPage(wizard, "Page 2"), 
        TitledPage(wizard, "Page 3"), 
        TitledPage(wizard, "Page 4"), 
        AddPage(wizard)] 
     for i in range(len(self.pageList)-1): 
      wx.wizard.WizardPageSimple.Chain(self.pageList[i],self.pageList[i+1]) 

     wizard.FitToPage(self.pageList[0]) 

     wizard.RunWizard(self.pageList[0]) 

     wizard.Destroy() 

#---------------------------------------------------------------------- 
#generic wizard pages 
class TitledPage(wiz.WizardPageSimple): 
    def __init__(self, parent, title): 
     """Constructor""" 
     wiz.WizardPageSimple.__init__(self, parent) 

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

     title = wx.StaticText(self, -1, title) 
     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) 

#---------------------------------------------------------------------- 
# page used to identify number of pages to add 
class AddPage(wiz.WizardPageSimple): 
    def __init__(self,parent): 
     self.parent = parent 
     """Constructor""" 
     wiz.WizardPageSimple.__init__(self, parent) 


     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 
     self.numPageAdd = wx.TextCtrl(self, -1, "") 
     self.verifyButton = wx.Button(self, id=wx.ID_ANY, label = "Confirm",name = "confirm") 
     self.verifyButton.Bind(wx.EVT_BUTTON, self.append_pages) 

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

    #function used to add pages to pageList inside of Wizard Object containing 
    # this page 
    def append_pages(self,event): 
     n = int(self.numPageAdd.GetValue()) 
     for i in range(n): 
      #Add n number of pages to wizard list "pageList" here.... 
      self.parent.pageList.append(TitledPage(wizard, "Added Page")) 

#---------------------------------------------------------------------- 

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

diesen Code erzeugen die folgende Fehlermeldung:

AttributeError: 'Wizard' object has no attribute 'pageList'

Und ich verstehe, warum das so ist, weil letztlich die Eltern der Seite der Objekt-Assistenten und nicht die DynaWiz Objekt. Gibt es eine Möglichkeit, auf die PageList-Liste im DynaWiz-Objekt zuzugreifen UND sicherzustellen, dass der aktuelle Assistent innerhalb des Ereignisses in der AddPage-Klasse neu geladen wird?

Antwort

0

Sie könnten die Dynawiz-Instanz einfach an den Konstruktor von AddPage übergeben. Dann kann AddPage pageList ändern. Siehe unten:

import wx 
import wx.wizard as wiz 

######################################################################## 


#---------------------------------------------------------------------- 
# Wizard Object which contains the list of wizard pages. 
class DynaWiz(object): 
    def __init__(self): 
     wizard = wx.wizard.Wizard(None, -1, "Simple Wizard") 
     self.pageList = [TitledPage(wizard, "Page 1"), 
        TitledPage(wizard, "Page 2"), 
        TitledPage(wizard, "Page 3"), 
        TitledPage(wizard, "Page 4"), 
        AddPage(wizard, self)] 
     for i in range(len(self.pageList)-1): 
      wx.wizard.WizardPageSimple.Chain(self.pageList[i],self.pageList[i+1]) 

     wizard.FitToPage(self.pageList[0]) 

     wizard.RunWizard(self.pageList[0]) 

     wizard.Destroy() 

#---------------------------------------------------------------------- 
#generic wizard pages 
class TitledPage(wiz.WizardPageSimple): 
    def __init__(self, parent, title): 
     """Constructor""" 
     wiz.WizardPageSimple.__init__(self, parent) 

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

     title = wx.StaticText(self, -1, title) 
     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) 

#---------------------------------------------------------------------- 
# page used to identify number of pages to add 
class AddPage(wiz.WizardPageSimple): 
    def __init__(self,parent,dynawiz): 
     self.parent = parent 
     self.dynawiz = dynawiz 
     """Constructor""" 
     wiz.WizardPageSimple.__init__(self, parent) 


     sizer = wx.BoxSizer(wx.VERTICAL) 
     self.SetSizer(sizer) 
     self.numPageAdd = wx.TextCtrl(self, -1, "") 
     self.verifyButton = wx.Button(self, id=wx.ID_ANY, label = "Confirm",name = "confirm") 
     self.verifyButton.Bind(wx.EVT_BUTTON, self.append_pages) 

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

    #function used to add pages to pageList inside of Wizard Object containing 
    # this page 
    def append_pages(self,event): 
     n = int(self.numPageAdd.GetValue()) 
     for i in range(n): 
      #Add n number of pages to wizard list "pageList" here.... 
      self.dynawiz.pageList.append(TitledPage(self.parent, "Added Page")) 
      wx.wizard.WizardPageSimple.Chain(self.dynawiz.pageList[-2],self.dynawiz.pageList[-1]) 
     self.parent.FindWindowById(wx.ID_FORWARD).SetLabel("Next >") 

#---------------------------------------------------------------------- 

if __name__ == "__main__": 
    app = wx.App(False) 
    dWiz = DynaWiz() 
    app.MainLoop() 
+0

Sie wissen, was ich versuchte, so etwas wie dies zu tun früher in meiner Batterie von „unglaublich frustriert versucht diese Arbeit zu bekommen“, aber ich habe versucht, den Pass am falschen Punkt in der Empfang Klasse zu akzeptieren . Danke dafür! Es ist perfekt! –

Verwandte Themen