2008-09-26 149 views
1

在wxPython中,如果我創建單選按鈕列表並最初放置列表,是否可以稍後更改列表中的內容?創建動態單選按鈕

例如,我有一個使用boxSizer最初放置小部件的面板。其中一個部件是單選按鈕列表(我也嘗試過一個普通的無線電框)。我想根據另一個類的變量動態地更改列表。

但是,一旦列表被放置在sizer中,它將被有效地「鎖定」;我不能只修改列表並使其顯示更改。如果我嘗試將列表重新添加到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

要使新的列表元素顯示在正確的位置,必須在向其添加新元素後重新佈置網格。例如,要添加一些新的項目,你可以調用:

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

兩個可能的解決方案

  1. 重建與無線電篩分器每次必須做出改變
  2. 在列表中按住單選按鈕,窗口小部件,並調用SetLabel你每次時間部件改變他們的標籤。
0

我能夠通過使用提供的信息DzinX修改它,並進行了一些修改。

看起來,張貼單選按鈕框首先「鎖定」到sizer的框中。如果我嘗試添加一個新框,我會收到一條錯誤消息,指出我正在嘗試將該窗口小部件添加到相同的sizer兩次。

通過最初簡單地刪除單選按鈕,讓用戶點擊一個按鈕來調用方法,我可以簡單地添加一個單選按鈕列表,而不會出現任何問題。

此外,通過讓用戶點擊一個按鈕,我沒有遇到「類Foo沒有屬性」欄的錯誤。很顯然,當嚮導啓動時,這些嚮導頁面的其餘部分將無法使用這些屬性。我以爲每次點擊「下一步」就會動態創建嚮導頁面,但它們都是同時創建的。