我正在尝试为个人程序创建下拉选项,根据所选项自动更新显示的名称。
问题是,无论选择什么或默认值是什么,它总是自动将所选名称更改为用户可以选择的最后一个选项,如果选择了其他选项,它将不会更改。
import tkinter
from tkinter import *
def changename(name=str):
selectedText.set(name)
mb.grid(row=1,column=1)
def startmainloop(var):
var.mainloop()
root = Tk()
label0=Label(root,text=".....")
label0.grid(row=0,columnspan=2)
selectedText=StringVar()
selectedText.set("Select Race")
mb=Menubutton(root, textvariable=selectedText,relief=GROOVE)
label1=Label(root, text="RACE")
label1.grid(row=1,column=0)
mb.grid()
mb.menu=Menu(mb, tearoff=0)
mb.menu.add_command(label="Argonian", command=changename("Argonian"))
mb.menu.add_command(label="Khajiit", command=changename("Khajiit"))
mb["menu"]=mb.menu
startmainloop(root)
在上面的图像中,它应显示的默认值为"选择Race"。使用两个命令选项" Argonian"单击选择比赛后,会出现一个下拉菜单。和" Khajiit"。点击选项" Argonian","选择比赛"菜单标签应更改为" Argonian"。选项" Khajiit"虽然看起来似乎超载了默认值,但无论用户选择Argonian如何都不会发生变化。
答案 0 :(得分:1)
当您以这种方式command=changename("Khajiit")
指定参数值时,它会调用该函数,然后将其返回值(None
)作为参数值传递。这是一个非常常见的Tkinter编程错误。
做这样的事情:
mb.menu.add_command(label="Argonian", command=lambda: changename("Argonian"))
mb.menu.add_command(label="Khajiit", command=lambda: changename("Khajiit"))
这将使值作为command
参数传递匿名函数,并使用正确的参数调用处理函数。
可以说更好,就像更通用和更少重复的方法一样,修改changename()
函数,以便检索命令本身的标签,然后你只需要指定一次字符串。
换句话说,做这样的事情:
def changename(index):
name = mb.menu.entrycget(index, "label")
selectedText.set(name)
mb.grid(row=1, column=1)
这将允许您只传递项目的索引:
mb.menu.add_command(label="Argonian", command=lambda: changename(0))
mb.menu.add_command(label="Khajiit", command=lambda: changename(1))
为了避免需要对每个命令的索引进行显式计数和硬编码,可以在for
循环中完成:
for i, label in enumerate(["Argonian", "Khajiit"]):
mb.menu.add_command(label=label, command=lambda: changename(i))