2012-07-11 47 views
0

以下代碼顯示了我的兩個選項菜單和回調函數'VarMenu'。這一切都工作得很好,除非我在每一行的循環中創建了幾個相同的選項菜單。當其中只有一個變爲'L'時,我只希望單元選項菜單的相應行更改爲'N',而不是其中的每一個。在循環中更改單個OptionMenu的文本變量Tkinter

我不想將事情與列表或巨大的代碼行混淆,但如果我創建了一個列表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) 

回答

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被設計成當它調用你的回調函數時,它總是傳遞一個參數,這個參數是用戶選擇的新值。這個論點將永遠存在。但是,您可以添加其他參數,如我的示例中所示。

+0

謝謝。我明白這是如何工作的,我一直在尋找更多的lambda,所以這是有道理的。但是,我必須爲第二個選項菜單創建一個類似的事情來讓它們一起更改嗎? – user2063 2012-07-11 13:03:24

+0

在這個例子中new_value對應什麼?我試圖合併變量單位,但它不適用於其他菜單。 – user2063 2012-07-11 14:15:19

+0

'new_value'是選項菜單的新值;它是由tkinter傳遞給命令的標準參數。它會一直通過,你無法控制。 – 2012-07-11 14:20:06