动态单选按钮创建
时间:2020-03-06 14:46:21 来源:igfitidea点击:
在wxPython中,如果我创建一个单选按钮列表并最初放置该列表,以后是否可以更改该列表中的内容?
例如,我有一个使用boxSizer放置面板的面板。这些小部件之一是单选按钮列表(我也尝试过普通的单选框)。我想基于另一个类的变量来动态更改列表。
但是,一旦将列表放置在sizer中,它实际上就被"锁定"了。我不能只修改列表并显示更改。如果我尝试将列表重新添加到sizer中,它只会放在面板的左上角。
我确定我可以隐藏原始列表,然后将新列表手动放置在相同的位置,但这感觉就像是一团糟。我敢肯定,我正在努力做这件事。我可能为此使用了错误的小部件,更不用说错误的方法了,但是我将其构建为一种学习体验。
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
解决方案
两种可能的解决方案
- 每次需要进行更改时,都使用收音机小部件重建大小调整器。
- 将单选按钮小部件保留在列表中,并在每次需要更改标签时调用SetLabel。
为了使新的列表元素出现在正确的位置,我们必须在向网格添加新元素之后重新布局网格。例如,要添加一些新项目,我们可以调用:
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"是调整大小的选项,我们可以将所有单选按钮保持打开状态。
我可以通过使用提供的信息DzinX进行一些修改来修复它。
似乎首先发布单选按钮框"锁定"了大小调整器。如果尝试添加新框,则会收到一条错误消息,提示我试图将小部件两次添加到相同的大小调整器中。
通过简单地最初删除单选按钮并让用户单击按钮来调用方法,我可以简单地添加单选按钮列表,而不会出现问题。
另外,通过让用户单击一个按钮,我没有遇到"类Foo没有属性'bar'"的错误。显然,当向导启动时,其余向导页面将无法使用该属性。我以为每次单击"下一步"都会动态创建向导页面,但是它们都是同时创建的。