0

次のコードは、2 つのオプション メニューとコールバック関数「VarMenu」を示しています。各行のループで同じオプションメニューをいくつか作成したことを除いて、これはすべてうまく機能します。それらの1つだけが「L」に変更される場合、ユニットオプションメニューの対応する行のみが「N」に変更され、それらのすべてではなく変更されます。

リストや大量のコード行とあまり混同したくありませんが、リストを作成した場合 self.type = [] は機能しますか?

前もって感謝します!

def VarMenu(self, selection):

    if selection == "L":
        self.variableunit.set("N")
        self.unit.config(state=DISABLED)
    else:
        self.variableunit.set("mm")
        self.unit.config(state=NORMAL)

def import_file(self): # Not complete code
    for row_number, row_data in enumerate(info):
        self.variable = StringVar(self.frame_table)                                
        self.variable.set(pre(code))
        self.type = OptionMenu(self.frame_table, self.variable, "None", "Clear", "F", "L", command=self.VarMenu)
        self.type.grid(row=row_number+i, column=3, sticky="nsew", padx=1, pady=1)

    # Unit drop down menu
        self.unit = OptionMenu(self.frame_table, self.variableunit, "mm", "N")
        self.unit.grid(row=row_number+i, column=5, sticky="nsew", padx=1, pady=1)
4

1 に答える 1

0

これを行うとき:

for row_number, row_data in enumerate(info):
    self.variable = StringVar(...)

self.variable...最近作成したもので上書きし続けていることに気づいていますか?どういうわけか魔法のように複数の変数を保持することをどのように期待しますか?

代わりに、lambdaまたはfunctools.partialを使用して変数をコールバックに渡す必要があります。例えば:

for row_number, row_data in enumerate(info):
    var = StringVar(...)
    self.type = OptionMenu(..., command=lambda new_value, variable=var: self.VarMenu(new_value, variable)

もちろん、コールバックで必要な行番号やその他の情報を渡すことができます。

注:OptionMenuは、コールバックを呼び出すときに、ユーザーが選択した新しい値である1つの引数を常に渡すように設計されています。この引数は常に存在します。ただし、私の例に示すように、引数を追加することはできます。

于 2012-07-11T12:51:00.743 に答える