2008-09-26 18 views
1

Dans wxPython, si je crée une liste de boutons radio et que je place la liste initialement, est-il possible de modifier le contenu de cette liste ultérieurement? Par exemple, j'ai un panneau qui utilise un boxSizer pour placer les widgets au départ. Un de ces widgets est une liste de boutons radio (j'ai aussi essayé un radiobox normal). Je voudrais changer dynamiquement la liste basée sur des variables d'une autre classe. Cependant, une fois la liste placée dans le calibreur, elle est effectivement "verrouillée"; Je ne peux pas simplement modifier la liste et faire apparaître les changements. Si j'essaye de rajouter la liste au calibreur, elle sera placée dans le coin supérieur gauche du panneau.Création d'un bouton radio dynamique

Je suis sûr que je pourrais cacher la liste originale et placer manuellement la nouvelle liste dans la même position mais cela ressemble à un kludge. Je suis sûr que je rends cela plus difficile que ça. J'utilise probablement les mauvais widgets pour cela, et encore moins la mauvaise approche, mais je construis cela comme une expérience d'apprentissage.

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 

Répondre

1

Pour que les nouveaux éléments de liste apparaissent correctement, vous devez redéfinir la grille après l'ajout de nouveaux éléments. Par exemple, pour ajouter quelques nouveaux éléments, vous pouvez appeler:

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 

self.grid1 est le calibreur vous conservez tous vos boutons radio.

0

Deux solutions possibles

  1. Reconstruire le calibreur avec la radio widgets chaque fois que vous devez faire un changement
  2. Tenir les widgets bouton radio dans une liste, et appelez setLabel chaque fois que vous avez pour changer leurs étiquettes.
0

J'ai été en mesure de le réparer en utilisant l'info DzinX fournie, avec quelques modifications.

Il semble que l'affichage de la boîte de boutons radio d'abord "verrouillé" dans la boîte pour le calibreur. Si j'essayais d'ajouter une nouvelle boîte, j'obtiendrais un message d'erreur indiquant que j'essayais d'ajouter le widget au même calibreur deux fois. En supprimant simplement les boutons radio et en demandant à l'utilisateur de cliquer sur un bouton pour appeler une méthode, je pourrais simplement ajouter une liste de boutons radio sans problème.

En outre, en ayant l'utilisateur cliquez sur un bouton, je n'ai pas rencontré d'erreurs de "classe Foo n'a aucun attribut" barre "". Apparemment, lorsque l'assistant s'initialise, les attributs ne sont pas disponibles pour le reste des pages de l'assistant. J'avais pensé que les pages de l'assistant étaient créées dynamiquement à chaque clic de "Suivant" mais elles étaient toutes créées en même temps.