如果我生成带有通过列表创建的复选按钮的Menubutton,如何获得所选按钮的名称?

时间:2019-11-03 21:35:10

标签: python tkinter

好吧,这个问题很难措辞,这是为什么:

我想创建一个带有清单按钮的菜单按钮。

tflist = tf.liste
for tf in tflist:
    n1mb.menu.add_checkbutton(label=tf,command=n1change)

n1mb是菜单按钮

n1change是一个函数

def n1change():
    n1mb['text'] = tf

我想做的是,菜单按钮显示选中的按钮。

显示的代码的问题在于,如果我选择一个按钮,则菜单按钮会标记为列表中的最后一项,而不是所选的。

1 个答案:

答案 0 :(得分:0)

创建复选按钮后,您将遍历tflist。完成此循环后,tf具有tflist中最后一项的值。如果您以后从未更改过tf,则设置n1mb['text'] = tf会将文本始终设置为tflist的最后一个值。

您想要的是将要设置的文本“烘烤”到您设置的command中。您可以使用command匿名函数为lambda附加参数ti。在循环you need to bind the variable in the lambda call中执行此操作时。因此您的命令应如下所示:

command=lambda text=tf: n1change(text)

但是,此行为对于复选按钮并没有真正意义,因为您可以单独启用和禁用它们。我猜您实际上需要单选按钮,在任何时候都只有一个是激活的。一个完整的例子是:

import tkinter as tk

root = tk.Tk()

v = tk.IntVar()

n1mb = tk.Menubutton(root, text="condiments", relief=tk.RAISED)
n1mb.grid()


def n1change(tf):
    n1mb['text'] = tf


n1mb.menu = tk.Menu(n1mb, tearoff=0)
n1mb["menu"] = n1mb.menu

tflist = ['a', 'b', 'c']

for tf in tflist:
    n1mb.menu.add_radiobutton(label=tf, command=lambda text=tf: n1change(text))

n1mb.pack()
root.mainloop()