Pergunta

Em wxPython, se eu criar uma lista de botões de rádio e coloque a lista inicialmente, é possível alterar o conteúdo dessa lista mais tarde?

Por exemplo, eu tenho um painel que utiliza um boxSizer para colocar os widgets inicialmente. Um desses widgets é uma lista de botões de rádio (eu também tentei um radiobox normal). Gostaria de alterar dinamicamente a lista com base em variáveis ??de outra classe.

No entanto, uma vez que a lista é colocado no sizer, é efetivamente "bloqueado"; Eu não posso simplesmente modificar a lista e ter as alterações aparecem. Se eu tentar re-adicionar a lista para o calibrador, ele só é colocado no canto esquerdo superior do painel.

Eu tenho certeza que eu poderia esconder a lista original e manualmente colocar a nova lista na mesma posição, mas que se sente como um remendo. Eu tenho certeza que eu estou fazendo isso mais difícil do que é. Eu provavelmente estou usando os widgets erradas para isso, muito menos a abordagem errada, mas eu estou construindo isso como uma experiência de aprendizagem.

    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
Foi útil?

Solução

Para fazer novos elementos da lista aparecem em lugares corretos, você tem que re-disposição a rede depois de adicionar novos elementos a ele. Por exemplo, para adicionar alguns novos itens, você poderia chamar:

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

onde self.grid1 é o calibrador de você manter todos os seus botões de rádio on.

Outras dicas

Duas soluções possíveis

  1. Reconstruir o sizer com o rádio widgets de cada vez que você tem que fazer uma mudança
  2. segure o botão de rádio de widgets em uma lista, e chamar setLabel cada vez que você tem que mudar seus rótulos.

Eu era capaz de corrigi-lo usando a informação DzinX fornecido, com algumas modificações.

Parece que postar os botões de rádio caixa de primeiros "travado" na caixa à sizer. Se eu tentei adicionar uma nova caixa, gostaria de obter uma mensagem de erro informando que eu estava tentando adicionar o widget ao mesmo sizer duas vezes.

Simplesmente removendo os botões de rádio, inicialmente, e ter o usuário clicar em um botão para chamar um método, eu poderia simplesmente adicionar uma lista de botões de rádio, sem um problema.

Além disso, por ter o usuário clicar em um botão, eu não correr em erros de "classe Foo tem nenhum atributo 'bar'". Aparentemente, quando os initalizes assistente, os atributos não estão disponíveis para o resto das páginas do assistente. Eu tinha pensado que as páginas do assistente foram criadas dinamicamente com cada clique em "Next", mas todos eles são criados ao mesmo tempo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top