2012-07-11 95 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