[英]Tkinter OptionMenu items being read as values for master
我正在为我的游戏项目构建一个临时界面,以便在等待图稿通过时可以与之交互并对其进行测试,其中包括下拉菜单以选择动作。 我只是似乎无法让OptionMenu小部件正常工作。
我见过很多人称呼它为:
optionmenu=tkinter.OptionMenu(master, variable, *listitems)
在上下文中,这看起来像:
UI.window=tkinter.Tk(className='/Temporary Interface')
standard_move=tkinter.StringVar()
standard_move.set('Attack')
standard_moves=tkinter.OptionMenu(master=UI.window,variable=standard_move,*list(UI.party[UI.control.get()].normal_moves))
其中UI.party[UI.control.get()]
是代表战斗人员的自定义类的实例,而normal_moves
是{'Move Name':move_function}
形式的类的字典属性,所以我正在传递加入并解压缩玩家提供的所有动作名称作为其当前角色的列表。
运行它会产生错误TypeError: __init__() got multiple values for argument 'master'
,我不知道为什么。 一点帮助找出原因并修复错误将有很大帮助。
OptionMenu(master=UI.window,variable=standard_move,*list(UI.party[UI.control.get()].normal_moves))
当您像这样混合关键字参数和打包的位置参数时, *list
首先绑定到位置参数,将列表的第一个元素放在master
,第二个放在variable
,其余放在选项中。 然后,关键字参数尝试将其自身绑定到master
和variable
,但是会发生TypeError,因为这些名称已经具有值。
考虑以下简单示例:
def f(a,b,c):
print(a,b,c)
f(a=23, *[42,99])
#TypeError: f() got multiple values for argument 'a'
尝试传入前两个参数而不使用其名称。
standard_moves=tkinter.OptionMenu(UI.window,standard_move,*list(UI.party[UI.control.get()].normal_moves))
不要说:
OptionMenu(master=UI.window, ...
而是说:
OptionMenu(UI.window, ...
换句话说,不要使用master
关键字。 第一个值不是可选的。 关键字通常与可选参数一起使用,以使API更加整洁。
另外,也不要使用variable
关键字。 只需传递值即可。
由于使用了关键字,系统抱怨母版有“多个值”。 我猜想系统没有看到以master身份传递的非关键字参数,而是假设master要么是None要么是* listitems中的第一项。 然后它看到您的master=
并抱怨多个值。 我只是运行了这个简单的测试用例来证明这一点。 将master=root
和variable=variable
放在一起会重现您的错误。
from tkinter import *
root = Tk()
variable = StringVar()
values = list('abc')
option = OptionMenu(root, variable, *values)
option.pack()
root.mainloop()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.