创建下拉菜单项选择Python

时间:2015-07-29 02:53:01

标签: python tkinter

我正在尝试为个人程序创建下拉选项,根据所选项自动更新显示的名称。

问题是,无论选择什么或默认值是什么,它总是自动将所选名称更改为用户可以选择的最后一个选项,如果选择了其他选项,它将不会更改。

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如何都不会发生变化。

1 个答案:

答案 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))