Динамическое создание радиокнопок - PullRequest
1 голос
/ 26 сентября 2008

В wxPython, если я создаю список переключателей и помещаю список изначально, возможно ли изменить содержимое этого списка позже?

Например, у меня есть панель, которая использует boxSizer для первоначального размещения виджетов. Один из этих виджетов - это список переключателей (я также попробовал обычный радиобокс). Я хотел бы динамически изменить список на основе переменных из другого класса.

Однако, как только список помещен в классификатор, он фактически «заблокирован»; Я не могу просто изменить список и получить изменения. Если я попытаюсь повторно добавить список в классификатор, он просто будет помещен в верхний левый угол панели.

Я уверен, что мог бы спрятать исходный список и вручную поместить новый список в ту же позицию, но это похоже на пометку. Я уверен, что я делаю это сложнее, чем есть. Вероятно, я использую неправильные виджеты для этого, тем более неправильный подход, но я строю это как опыт обучения.

    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

Ответы [ 3 ]

1 голос
/ 26 сентября 2008

Чтобы новые элементы списка отображались в правильных местах, вам необходимо изменить макет сетки после добавления в нее новых элементов. Например, чтобы добавить несколько новых предметов, вы можете позвонить:

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 - это размер, на котором вы держите все свои переключатели.

0 голосов
/ 28 сентября 2008

Мне удалось исправить это с помощью информации, предоставленной DzinX, с некоторыми изменениями.

Похоже, что отправка блока переключателей сначала «заблокирована» в блоке сортировщика. Если бы я попытался добавить новое поле, я получил бы сообщение об ошибке, в котором говорилось, что я пытался добавить виджет в один и тот же размер дважды.

Просто сначала убрав переключатели и попросив пользователя нажать кнопку для вызова метода, я мог бы просто добавить список переключателей без проблем.

Кроме того, когда пользователь нажимал кнопку, я не сталкивался с ошибками «у класса Foo нет атрибута« bar »». Очевидно, что при инициализации мастера атрибуты становятся недоступными для остальных страниц мастера. Я думал, что страницы мастера динамически создаются при каждом нажатии кнопки «Далее», но все они создаются одновременно.

0 голосов
/ 26 сентября 2008

Два возможных решения

  1. Перестройте sizer с виджетами радио каждый раз, когда вам нужно внести изменения
  2. Удерживайте переключатели в списке и вызывайте SetLabel каждый раз, когда вам нужно изменить их метки.
...