[英]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.