Question

Dans wxPython, si je crée une liste de boutons radio et que je la place initialement, est-il possible de modifier le contenu de cette liste ultérieurement?

Par exemple, un panneau utilise un boxSizer pour placer les widgets initialement. L'un de ces widgets est une liste de boutons radio (j'ai également essayé une radiobox normale). J'aimerais modifier dynamiquement la liste en fonction de variables d'une autre classe.

Cependant, une fois la liste placée dans le classeur, elle est effectivement "verrouillée"; Je ne peux pas simplement modifier la liste et faire apparaître les modifications. Si j'essaie de ré-ajouter la liste au sizer, elle sera simplement placée dans le coin supérieur gauche du panneau.

Je suis sûr de pouvoir masquer la liste d'origine et de placer manuellement la nouvelle liste dans la même position, mais cela ressemble à un flou. Je suis sûr que je rends la situation plus difficile qu’elle ne l’est. J'utilise probablement les mauvais widgets pour cela, 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
Était-ce utile?

La solution

Pour que les nouveaux éléments de la liste apparaissent aux bons endroits, vous devez réorganiser la grille après lui avoir 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 sur lequel tous les boutons radio sont activés.

Autres conseils

Deux solutions possibles

  1. Reconstruisez le dimenseur avec les widgets radio chaque fois que vous devez effectuer un changement
  2. Maintenez les widgets de bouton radio dans une liste et appelez SetLabel chaque fois que vous devez modifier leurs étiquettes.

J'ai pu résoudre ce problème en utilisant les informations fournies par DzinX, avec quelques modifications.

Il semble que l'affichage de la boîte de boutons d'option en premier lieu "verrouillé". la boîte à la sizer. Si j'essayais d'ajouter une nouvelle boîte, j'obtiendrais un message d'erreur indiquant que j'essayais d'ajouter le widget deux fois au même fabricant.

En supprimant simplement les boutons radio au départ et en demandant à l'utilisateur de cliquer sur un bouton pour appeler une méthode, je pouvais simplement ajouter une liste de boutons radio sans problème.

De plus, en demandant à l'utilisateur de cliquer sur un bouton, je n'ai pas rencontré d'erreur de "classe Foo n'a pas d'attribut 'bar' '. Apparemment, lorsque l'assistant est initialisé, les attributs ne sont pas disponibles pour le reste des pages de l'assistant. J'avais pensé que les pages de l'assistant avaient été créées dynamiquement à chaque clic sur "Suivant". mais ils sont tous créés en même temps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top