【问题标题】:Changing textvariable for single OptionMenu in loop Tkinter在循环 Tkinter 中更改单个 OptionMenu 的文本变量
【发布时间】:2012-07-11 08:54:45
【问题描述】:

以下代码显示了我的两个选项菜单和回调函数“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)

【问题讨论】:

    标签: python list tkinter ttk


    【解决方案1】:

    当你这样做时:

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

    【讨论】:

    • 谢谢。我了解它是如何工作的,并且我一直在关注 lambda,所以这是有道理的。但是,我是否必须为第二个选项菜单创建一个类似的东西才能一起更改?
    • 这个例子中new_value对应什么?我试图合并变量单元,但它不适用于其他菜单。
    • new_value 是选项菜单的新值;它是 tkinter 传递给命令的标准参数。它总是会被通过,你无法控制它。
    • 如果我将其更改为 variableunit(单位选项菜单中的 stringvar),这会起作用吗?我的代码正在被读取,但如果我将第 1 行更改为“L”,则单元中的第二行将被禁用..
    • @user2063:我不知道你所说的“这个”是什么意思。如果您在我的示例中指的是new_value,您可以随意命名。无论如何,当回调被调用时,它将被赋予选项菜单的新值。这就是 optionmenu 的工作原理——第一个参数始终是 optionmenu 的新值。
    猜你喜欢
    • 2022-09-23
    • 2017-02-05
    • 2020-10-06
    • 1970-01-01
    • 2018-02-13
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2015-10-01
    相关资源
    最近更新 更多