2008-09-26 11 views
1

wxPython에서 라디오 버튼 목록을 만들고 처음에 목록을 배치하면 나중에 해당 목록의 내용을 변경할 수 있습니까?동적 라디오 버튼 생성

예를 들어 boxSizer를 사용하여 위젯을 처음으로 배치하는 패널이 있습니다. 위젯 중 하나는 라디오 버튼 목록입니다 (일반 라디오 박스도 시도했습니다). 다른 클래스의 변수를 기반으로 목록을 동적으로 변경하고 싶습니다.

그러나 일단 목록이 sizer에 배치되면 효과적으로 "잠긴"상태가됩니다. 목록을 수정하고 변경 사항을 표시 할 수는 없습니다. 크기 조정기에 목록을 다시 추가하려고하면 패널 왼쪽 상단에 배치됩니다.

나는 원래 목록을 숨기고 수동으로 같은 위치에 새 목록을 배치 할 수 있지만 kludge와 같은 느낌이 들었습니다. 나는 이것이 이것을 어렵게 만들고 있다고 확신한다. 나는 잘못된 위젯을 사용하고 있는데, 잘못된 접근법은 훨씬 적지 만 이것을 학습 경험으로 구축하고 있습니다.

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 

답변

1

새 목록 요소가 올바른 위치에 나타나게하려면 새 요소를 추가 한 후에 그리드를 다시 레이아웃해야합니다. 예를 들어, 몇 가지 새로운 항목을 추가, 당신은 호출 할 수

self.grid1
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 

당신에 대한 모든 라디오 버튼을 지키는 사이 저입니다.

0

두 가지 가능한 솔루션

  1. 라디오와 사이 저를 다시는
  2. 이 목록에있는 라디오 버튼 위젯을 잡고
  3. 변화를 만들고, 당신이 이때 setLabel 때마다 전화를해야 할 때마다 위젯 라벨을 바꾸려면
0

제공된 수정 정보와 함께 DzinX 정보를 사용하여 수정할 수있었습니다.

라디오 버튼 상자를 게시하면 처음에는 상자가 sizer에 "고정"된 것처럼 보입니다. 새 상자를 추가하려고하면 동일한 크기 조절기에 위젯을 두 번 추가하려고한다는 오류 메시지가 나타납니다.

처음에는 라디오 버튼을 제거하고 사용자가 버튼을 클릭하여 메소드를 호출하게함으로써 간단히 아무런 문제없이 라디오 버튼 목록을 추가 할 수 있습니다.

또한 사용자가 버튼을 클릭하게하여 "class Foo에 특성 'bar'가 없습니다"라는 오류가 발생하지 않았습니다. 마법사가 초기화 될 때 나머지 마법사 페이지에서는 특성을 사용할 수 없습니다. 마법사 페이지는 "다음"을 클릭 할 때마다 동적으로 생성되지만 동시에 생성됩니다.