動的なラジオボタンの作成
-
02-07-2019 - |
質問
wxPythonでは、ラジオボタンのリストを作成し、最初にリストを配置した場合、そのリストの内容を後で変更することはできますか?
たとえば、ウィジェットを最初に配置するためにboxSizerを使用するパネルがあります。それらのウィジェットの1つはラジオボタンのリストです(通常のラジオボックスも試しました)。別のクラスの変数に基づいてリストを動的に変更したい。
ただし、リストがサイザーに配置されると、実質的に「ロック」されます。リストを変更して変更を表示することはできません。リストをサイザーに再度追加しようとすると、パネルの左上隅にリストが表示されます。
元のリストを非表示にして、新しいリストを同じ位置に手動で配置することはできますが、それは手間がかかりそうです。これをもっと難しくしていると思います。私はおそらくこれに間違ったウィジェットを使用しているでしょうが、間違ったアプローチではありませんが、学習体験としてこれを構築しています。
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
は、すべてのラジオボタンを保持するサイザーです。
他のヒント
2つの可能な解決策
- 変更が必要になるたびにラジオウィジェットでサイザーを再構築します
- ラジオボタンウィジェットをリストで保持し、ラベルを変更する必要があるたびにSetLabelを呼び出します。
提供された情報DzinXを使用して修正することができました。
ラジオボタンボックスを最初に「ロックイン」して投稿するようです。サイザーへの箱。新しいボックスを追加しようとすると、同じサイザーにウィジェットを2回追加しようとしていることを示すエラーメッセージが表示されます。
ラジオボタンを最初に削除し、ユーザーにボタンをクリックしてメソッドを呼び出させるだけで、ラジオボタンのリストを問題なく追加できます。
さらに、ユーザーにボタンをクリックさせることで、「class Foo has no attribute 'bar'」というエラーに遭遇しませんでした。どうやら、ウィザードが初期化されると、残りのウィザードページで属性を使用できなくなります。 「次へ」をクリックするたびに、ウィザードページが動的に作成されると思っていました。しかし、それらはすべて同時に作成されます。