我正在为我的游戏项目构建一个临时界面,这样我就可以在等待图片通过的同时与它交互并测试它,这涉及到选择移动的下拉菜单。我似乎就是不能让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',我不知道为什么。找出原因并修复错误会有很大的帮助。
发布于 2017-12-16 01:11:43
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))发布于 2017-12-16 01:19:10
不要说:
OptionMenu(master=UI.window, ...相反,你可以说:
OptionMenu(UI.window, ...换句话说,不要使用master关键字。第一个值是不可选的。关键字通常与可选参数一起使用,以使API更简洁。
另外,也不要使用variable关键字。只需传入值即可。
由于使用了关键字,系统对master报告了“多个值”。我猜测,系统没有看到作为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()https://stackoverflow.com/questions/47836837
复制相似问题