2

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
4

3 に答える 3

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すべてのラジオボタンをオンにしているサイザーはどこにありますか。

于 2008-09-26T12:06:40.560 に答える
0

DzinXが提供する情報を使用して、いくつかの変更を加えて修正できました。

ラジオボタンボックスを最初に投稿すると、ボックスがサイザーに「ロックイン」されたようです。新しいボックスを追加しようとすると、ウィジェットを同じサイザーに 2 回追加しようとしているというエラー メッセージが表示されます。

最初にラジオ ボタンを削除し、ユーザーにボタンをクリックしてメソッドを呼び出させるだけで、問題なくラジオ ボタンのリストを簡単に追加できました。

さらに、ユーザーにボタンをクリックさせることで、「クラス Foo に属性 'bar' がありません」というエラーが発生しなくなりました。どうやら、ウィザードが初期化されると、残りのウィザード ページで属性を使用できなくなります。「次へ」をクリックするたびにウィザードページが動的に作成されると思っていましたが、すべて同時に作成されます。

于 2008-09-28T09:47:15.387 に答える
0

考えられる 2 つの解決策

  1. 変更が必要になるたびに、ラジオ ウィジェットを使用してサイザーを再構築します。
  2. ラジオ ボタン ウィジェットをリストに保持し、ラベルを変更する必要があるたびに SetLabel を呼び出します。
于 2008-09-26T09:34:03.090 に答える