Pregunta

En wxPython, si creo una lista de botones de opción y coloco la lista inicialmente, ¿es posible cambiar el contenido de esa lista más adelante?

Por ejemplo, tengo un panel que usa un boxSizer para colocar los widgets inicialmente. Uno de esos widgets es una lista de botones de radio (también probé una radiobox normal). Me gustaría cambiar dinámicamente la lista basada en variables de otra clase.

Sin embargo, una vez que la lista se coloca en el medidor, está efectivamente " bloqueada " ;; No puedo simplemente modificar la lista y hacer que aparezcan los cambios. Si intento volver a agregar la lista al medidor, simplemente se coloca en la esquina superior izquierda del panel.

Estoy seguro de que podría ocultar la lista original y colocar manualmente la nueva lista en la misma posición, pero se siente como un kludge. Estoy seguro de que estoy haciendo esto más difícil de lo que es. Probablemente estoy usando los widgets equivocados para esto, y mucho menos el enfoque equivocado, pero estoy construyendo esto como una experiencia de aprendizaje.

    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
¿Fue útil?

Solución

Para hacer que los nuevos elementos de la lista aparezcan en los lugares correctos, debe rediseñar la cuadrícula después de agregarle nuevos elementos. Por ejemplo, para agregar algunos elementos nuevos, puede llamar:

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

donde self.grid1 es el medidor en el que mantienes todos los botones de radio activados.

Otros consejos

Dos posibles soluciones

  1. Reconstruya el medidor con los widgets de radio cada vez que tenga que hacer un cambio
  2. Mantenga los widgets de los botones de radio en una lista y llame a SetLabel cada vez que tenga que cambiar sus etiquetas.

Pude solucionarlo usando la información que proporcionó DzinX, con algunas modificaciones.

Parece que la publicación del cuadro de botones de radio primero " bloqueado en " La caja al medidor. Si intentara agregar una nueva casilla, obtendría un mensaje de error que indica que estaba intentando agregar el widget al mismo medidor dos veces.

Al simplemente quitar los botones de opción inicialmente y hacer que el usuario haga clic en un botón para llamar a un método, simplemente podría agregar a la lista de botones de opción sin problemas.

Además, al hacer que el usuario haga clic en un botón, no encontré errores de la clase "Foo" no tiene atributo "barra" " ;. Aparentemente, cuando el asistente se inicia, los atributos no están disponibles para el resto de las páginas del asistente. Pensé que las páginas del asistente se creaban dinámicamente con cada clic de " Siguiente " pero todos se crean al mismo tiempo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top