好吧,这个问题很难措辞,这是为什么:
我想创建一个带有清单按钮的菜单按钮。
tflist = tf.liste
for tf in tflist:
n1mb.menu.add_checkbutton(label=tf,command=n1change)
n1mb是菜单按钮
n1change是一个函数
def n1change():
n1mb['text'] = tf
我想做的是,菜单按钮显示选中的按钮。
显示的代码的问题在于,如果我选择一个按钮,则菜单按钮会标记为列表中的最后一项,而不是所选的。
答案 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()