Frage

In wxPython, wenn ich eine Liste von Radiobuttons erstellen und legen Sie die Liste zunächst ist es möglich, den Inhalt in der Liste später zu ändern?

Zum Beispiel habe ich eine Platte, die einen boxSizer verwendet zunächst die Widgets zu platzieren. Eines dieser Widgets ist eine Liste von Radiobuttons (Ich habe auch versucht, ein normales Radiobox). Ich mag dynamisch die Liste ändern, basierend auf Variablen von einer anderen Klasse.

Sobald jedoch die Liste in der Sizer platziert wird, ist es effektiv „gesperrt“; Ich kann nicht nur die Liste ändern und haben die Änderungen erscheinen. Wenn ich versuche, erneut das Hinzufügen der Liste an die Sizer, es ist nur in der linken oberen Ecke des Fensters gesetzt wird.

Ich bin sicher, dass ich die ursprüngliche Liste verstecken konnte und manuell die neue Liste in der gleichen Position bringen, aber das fühlt sich an wie eine Flickschusterei. Ich bin sicher, ich mache diese schwieriger, als es ist. Ich bin wahrscheinlich die falschen Widgets für diese Verwendung, viel weniger den falschen Ansatz, aber ich baue diese als Lernerfahrung.

    class Job(wiz.WizardPageSimple):
    """Character's job class."""

    def __init__(self, parent, title, attribs):
        wiz.WizardPageSimple.__init__(self, parent)
        self.next = self.prev = None
        self.sizer = makePageTitle(self, title)
        self.charAttribs = attribs

#---Create widgets
        self.Job_list = ["Aircraft Mechanic", "Vehicle Mechanic", "Electronics Specialist"]

        box1_title = wx.StaticBox( self, -1, "" )
        box1 = wx.StaticBoxSizer( box1_title, wx.VERTICAL )
        grid1 = wx.BoxSizer(wx.VERTICAL)
        for item in self.Job_list:
            radio = wx.RadioButton(self, -1, item)
            grid1.Add(radio)

##Debugging
        self.btn = wx.Button(self, -1, "click")
        self.Bind(wx.EVT_BUTTON, self.eligibleJob, self.btn)

#---Place widgets
        self.sizer.Add(self.Job_intro)
        self.sizer.Add(self.btn)
        box1.Add(grid1)
        self.sizer.Add(box1)        

    def eligibleJob(self, event):
        """Determine which Jobs a character is eligible for."""

        if self.charAttribs.intelligence >= 12:
            skillList = ["Analyst", "Interrogator", "Fire Specialist", "Aircraft Pilot"]
            for skill in skillList:
                self.Job_list.append(skill)
            print self.Job_list ##Debugging
        #return self.Job_list
War es hilfreich?

Lösung

Um neue Listenelemente erscheinen in richtigen Stellen zu machen, müssen Sie das Raster erneut Layout nach neuen Elementen ihn hinzufügen. Zum Beispiel, ein paar neue Elemente hinzuzufügen, könnte man nennen:

def addNewSkills(self, newSkillList):
    '''newSkillList is a list of skill names you want to add'''
    for skillName in newSkillList:
        newRadioButton = wx.RadioButton(self, -1, skillName)
        self.grid1.Add(newRadioButton) # appears in top-left corner of the panel
    self.Layout() # all newly added radio buttons appear where they should be
    self.Fit() # if you need to resize the panel to fit new items, this will help

wo self.grid1 ist die Sizer Sie alle Radio halten Tasten auf.

Andere Tipps

Zwei mögliche Lösungen

  1. Erstellen Sie die Sizer mit den Radio-Widgets jedes Mal, wenn Sie eine Änderung vornehmen müssen
  2. Halten Sie das Optionsfeld-Widgets in einer Liste, und rufe jedes setLabel Mal, wenn Sie ihre Etiketten ändern.

Ich war in der Lage, es zu beheben, indem Sie die Informationen mit DzinX versehen, mit einigen Änderungen.

Es scheint, dass die Buchung der Radio-Buttons der Box auf den Sizer „eingesperrt“ erstes Feld. Wenn ich ein neues Feld hinzuzufügen versucht, würde ich eine Fehlermeldung erhalten, dass ich versuchte, zweimal das Widget auf dem gleichen Sizer hinzuzufügen.

Durch einfaches die Radio-Buttons zunächst zu entfernen und mit der Benutzer auf eine Schaltfläche klicken, um eine Methode aufzurufen, ich könnte einfach eine Liste von Radio-Buttons ohne Probleme hinzufügen.

Zusätzlich kann durch die Benutzer auf eine Schaltfläche klicken zu müssen, ich habe laufen nicht in Fehler „Klasse Foo hat kein Attribut‚bar‘“. Offenbar, wenn der Assistent initalizes, sind die Attribute für den Rest der Seiten des Assistenten nicht zur Verfügung. Ich hatte die Assistentenseiten gedacht wurden, dynamisch mit jedem Klick auf „Next“ erstellt, aber sie sind alle in der gleichen Zeit erstellt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top