Domanda

In wxPython, se creo un elenco di pulsanti di opzione e posiziono inizialmente l'elenco, è possibile modificare il contenuto di tale elenco in un secondo momento?

Ad esempio, ho un pannello che utilizza un boxSizer per posizionare inizialmente i widget. Uno di questi widget è un elenco di pulsanti di opzione (ho anche provato un normale radiobox). Vorrei cambiare dinamicamente l'elenco in base alle variabili di un'altra classe.

Tuttavia, una volta che l'elenco viene inserito nel sizer, è effettivamente "bloccato"; Non posso semplicemente modificare l'elenco e visualizzare le modifiche. Se provo ad aggiungere nuovamente l'elenco al sizer, viene semplicemente inserito nell'angolo in alto a sinistra del pannello.

Sono sicuro di poter nascondere l'elenco originale e posizionare manualmente il nuovo elenco nella stessa posizione, ma mi sembra un kludge. Sono sicuro di renderlo più difficile di quanto non sia. Probabilmente sto usando i widget sbagliati per questo, tanto meno l'approccio sbagliato, ma sto costruendo questo come un'esperienza di apprendimento.

    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
È stato utile?

Soluzione

Per fare in modo che i nuovi elementi dell'elenco vengano visualizzati in posizioni corrette, è necessario ridimensionare la griglia dopo aver aggiunto nuovi elementi. Ad esempio, per aggiungere alcuni nuovi elementi, è possibile chiamare:

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

dove self.grid1 è il riduttore su cui tenere tutti i pulsanti di opzione

Altri suggerimenti

Due possibili soluzioni

  1. Ricostruisci il sizer con i widget radio ogni volta che devi apportare una modifica
  2. Tieni i widget dei pulsanti di opzione in un elenco e chiama SetLabel ogni volta che devi cambiare le loro etichette.

Sono stato in grado di risolverlo utilizzando le informazioni fornite da DzinX, con alcune modifiche.

Sembra che pubblicando prima la casella dei pulsanti di opzione " bloccato in " la scatola per il calibratore. Se provassi ad aggiungere una nuova casella, visualizzerei un messaggio di errore che indica che stavo provando ad aggiungere il widget allo stesso sizer due volte.

Semplicemente rimuovendo inizialmente i pulsanti di opzione e facendo in modo che l'utente facesse clic su un pulsante per chiamare un metodo, potrei semplicemente aggiungere un elenco di pulsanti di opzione senza problemi.

Inoltre, facendo in modo che l'utente facesse clic su un pulsante, non ho riscontrato errori di "classe Foo" senza attributo "barra". Apparentemente, quando la procedura guidata viene disattivata, gli attributi non sono disponibili per il resto delle pagine della procedura guidata. Pensavo che le pagine della procedura guidata fossero state create dinamicamente con ogni clic di " Successivo " ma sono tutti creati contemporaneamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top