Вопрос

В 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
Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top