2017-12-15 7 views
0

ゲームプロジェクトの一時的なインターフェイスを構築して、アートワークを待っている間にインタラクティブに操作できるようにしています。ドロップダウンメニューから選択できます動きます。私はOptionMenuウィジェットを動作させることができないようです。私は人々をたくさん見てきましたTkinter OptionMenuのアイテムがマスターの値として読み取られる

はスタイルでそれを呼び出す:

optionmenu=tkinter.OptionMenu(master, variable, *listitems) 

とコンテキストで、のように見えること:

UI.party[UI.control.get()]が表すカスタムクラスのインスタンスである
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)) 

戦闘員であり、normal_movesは、形式が{'Move Name':move_function}のクラスの辞書属性なので、プレイヤーが現在のキャラクターとして提供している移動のすべての名前のリストを渡して解凍しています。

エラーが発生すると、エラーTypeError: __init__() got multiple values for argument 'master'が発生します。理由はわかりません。その理由を特定し、バグを修正する助けは、大きな助けになるでしょう。

キーワード引数とこのようなパック位置引数を混ぜた場合、 *listmasterのためのリストの最初の要素、 variableための第二、およびオプションの残りを入れて、最初の位置パラメータにバインドされます

答えて

0
OptionMenu(master=UI.window,variable=standard_move,*list(UI.party[UI.control.get()].normal_moves)) 

アイテム。キーワード引数はmastervariableに自身をバインドしようとしますが、名前にすでに値があるため、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)) 
0

は言ってはいけない:

OptionMenu(master=UI.window, ... 

は、代わりに言う:つまり

OptionMenu(UI.window, ... 

を、masterキーワードを使用しないでください。最初の値はオプションではありません。キーワードは、オプションの引数で頻繁に使用され、APIをよりクリーンにします。

また、variableキーワードも使用しないでください。値を渡すだけです。

キーワードの使用により、システムが「複数の値」について不平を言っています。私はシステムが、非キーワード引数がマスターとして渡されていないのを見て、masterがNoneまたは* listitemsの最初の項目であると仮定します。そして、それはあなたのmaster=を見て、複数の値について不平を言う。私はこの単純なテストケースを実行してそれを証明しました。 master=rootvariable=variableを入力するとエラーが再現されます。

from tkinter import * 

root = Tk() 
variable = StringVar() 
values = list('abc') 
option = OptionMenu(root, variable, *values) 
option.pack() 
root.mainloop() 
関連する問題