在循环Tkinter中更改单个OptionMenu的textvariable

时间:2012-07-11 08:54:45

标签: python list tkinter ttk

以下代码显示了我的两个选项菜单和回调函数'VarMenu'。这一切都很好,除非我在循环中为每一行创建了几个相同的选项菜单。当只有其中一个变为'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)

1 个答案:

答案 0 :(得分: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的设计使得当它调用您的回调时,它将始终传递一个参数,该参数是用户选择的新值。这个论点将永远存在。但是,您可以添加其他参数,如我的示例所示。