创建动态单选按钮
问题描述:
在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
答
要使新的列表元素显示在正确的位置,必须在向其添加新元素后重新布置网格。例如,要添加一些新的项目,你可以调用:
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
是你保持你的所有单选按钮的分级机。
答
两个可能的解决方案
- 重建与无线电筛分器每次必须做出改变
- 在列表中按住单选按钮,窗口小部件,并调用SetLabel你每次时间部件改变他们的标签。
答
我能够通过使用提供的信息DzinX修改它,并进行了一些修改。
看起来,张贴单选按钮框首先“锁定”到sizer的框中。如果我尝试添加一个新框,我会收到一条错误消息,指出我正在尝试将该窗口小部件添加到相同的sizer两次。
通过最初简单地删除单选按钮,让用户点击一个按钮来调用方法,我可以简单地添加一个单选按钮列表,而不会出现任何问题。
此外,通过让用户点击一个按钮,我没有遇到“类Foo没有属性”栏的错误。很显然,当向导启动时,这些向导页面的其余部分将无法使用这些属性。我以为每次点击“下一步”就会动态创建向导页面,但它们都是同时创建的。