문제

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

예를 들어, 박스 라이저를 사용하여 처음에는 위젯을 배치하는 패널이 있습니다. 이러한 위젯 중 하나는 라디오 버튼 목록입니다 (또한 일반 Radiobox를 사용해 보았습니다). 다른 클래스의 변수에 따라 목록을 동적으로 변경하고 싶습니다.

그러나 일단 목록이 사이저에 배치되면 효과적으로 "잠겨 있습니다". 목록을 수정할 수없고 변경 사항이 나타납니다. 목록을 사이저로 다시 반응하려고하면 패널의 왼쪽 상단에 올라갑니다.

원래 목록을 숨기고 새 목록을 같은 위치에 수동으로 배치 할 수 있지만 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
도움이 되었습니까?

해결책

새 목록 요소가 올바른 장소에 표시 되려면 새 요소를 추가 한 후 그리드를 다시 레이어해야합니다. 예를 들어, 몇 가지 새 항목을 추가하려면 다음을 호출 할 수 있습니다.

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