选项菜单在单击时不显示第一个选项(Tkinter)

5

我在代码中添加了一个OptionMenu小部件,并将一个列表分配为其选项。它是这样的:

z = StringVar()   
z.set(userList[0])    
usersOption = OptionMenu(frame1, z, *userList)#, command=changeUser)
usersOption.pack(side=RIGHT, padx=3)

现在,我认为它将显示列表中的所有选项。如下所示:
Option 1 \/ <-- the box with the selected option
Option 1 }\__the options that show on click
Option 2 }/

但实际上它只显示第二个选项,当我选择它时,基本上没有回头的路,如果我再次点击框,它仍然只显示选项2,即使我用上下箭头也无法更改。我尝试寻找解决方案,但却一无所获,所以我开始认为这是小部件的默认操作方式,但在我阅读的文档中找不到任何可以向我展示如何解决它的内容。
P.S.:我正在使用Python 3.3


z是一个Tkinter StringVar的实例吗?您确定userlist具有您认为它具有的值吗? - Bryan Oakley
是的,它是这样的,而且是的,它确实是这样的。该列表是从txt文件的行中创建的,没有换行符'\n'(我使用.strip())。目前,此文本文件有两行:“用户1”和“用户2”。并设置为userList [0]。(我将编辑文本以添加此内容) - AugustoQ
3个回答

7

我曾经遇到同样的问题,它让我发疯,所以我查看了源代码。我认为问题在于第三个构造函数参数是默认值。如果你不在*userList之前指定它,它看起来会把第一个项目作为默认值。一个真正的修复方法应该是:

z = StringVar()   
z.set(userList[0])    
usersOption = OptionMenu(frame1, z, userList[0] ,*userList)#, command=changeUser)
usersOption.pack(side=RIGHT, padx=3)

是的。就像在这个问题中所回答的那样。 - Kalissar
确实,在创建小部件时传递正确的参数是一个很好的建议。 ;¬) - martineau

6
迟来的回答...
只需使用
self.option = OptionMenu(PARENT, VALUE TO BE CHANGED, "DEFAULT TEXT", *OPTIONS_ARRAY/LIST)

对我来说完美地运作。


0
没关系,我把*userList去掉了,用for循环将项目插入命令中。现在它完美地工作了。
我使用的代码:
for user in userList:
    usersOption["menu"].insert("end", "command", label=user, command=_setit(z, user, changeUser))

在我看来,这种做法非常hacky,因为它使用了模块中定义的私有_setit()函数。既然你显然已经查看了源代码,为什么不直接将正确的参数传递给小部件的构造函数呢? - martineau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接