0

繰り返し作成されたチェックボックスからTkinterチェックボックスの値を取得しようとしています。関数の外部からこれらのチェックボックスのそれぞれ/いずれかに関連付けられた変数を参照する方法を理解することはできません__init__。関連するコードは次のとおりです。

class Display_Window():
    def __init__(self, parent):
# some code excluded here
        self.widgets = []
        for i in range(len(self.eventNameList)): # a list of dictionaries
            self.eventName = self.eventNameList[i]['event_name']
            self.var1 = IntVar()
            self.cbEvent = Checkbutton(self.myContainer, text=self.eventName,
                                                            variable=self.var1)
            self.cbEvent.grid(row = i+2, column = 0, sticky = W)
            self.cbEvent.deselect()
            self.widgets.append((self.eventName, self.cbEvent)

        self.bSelect = Button(self.myContainer, text="Select", width=10)
        self.bSelect.bind("<Button-1>",
                             lambda event, arg=self.widgets: self.select(arg))
        self.bSelect.bind("<Return>",
                             lambda event, arg=self.widgets: self.select(arg))
        self.bSelect.grid(row = 1, column = 2)

    def select(self, widgets):
        for widget in widgets:
            cBox = widget[1] # references the checkbox
            cBoxValue = #get() what?
4

1 に答える 1

1

動的な数のチェックボタンを作成しても、それらはインスタンスの属性として割り当てられません(割り当てるべきではありません)。あなたがしていることは、最後に作成されたものをメンバー属性として残すことですが、これはかなり無意味です。

また、ウィジェットのリストについては、ほぼ正しい考えがあります...

class Display_Window():
    def __init__(self, parent):
...snip...

        self.widgets = {}

        for i, eventDict in enumerate(self.eventNameList):        
            eventName = eventDict['event_name']
            var1 = IntVar()
            cbEvent = Checkbutton(self.myContainer, text=eventName, variable=var1) 
            cbEvent.grid(row = i+2, column = 0, sticky = W)
            cbEvent.deselect()

            self.widgets[eventName] = (cbEvent, var1)

        self.bSelect = Button(self.myContainer, text="Select", width=10)
        self.bSelect.bind("<Button-1>", self.select)
        self.bSelect.bind("<Return>", self.select)
        self.bSelect.grid(row = 1, column = 2)

    def select(self, *args):
        for widget, intvar in self.widgets.iteritems():
            # do stuff

上記の例のように、イベント名が一意であると想定して、チェックボタンをdictに格納することができます。これにより、リストをループする代わりに、名前で簡単に検索できるようになります。そして、そのdictで、最初のアイテムがウィジェットで、2番目のアイテムがIntVarであるタプルを格納しています。あなたが本当にそれをどのように整理したかはわかりませんが、それはそれらの参照を保存する1つの方法です。

また、は同じクラスのメンバーであるため、参照を渡すためにボタンのコールバックにカスタムラムダを実行する必要がなくなったようです。これは、 dictselectを確認するだけです。self.widgets

于 2012-08-15T21:45:38.203 に答える