2016-06-21 19 views
1

私はPythonを使ってゲーム用のコードを書こうとしていますが、後で使用するためにボタンのクリックコマンドから変数を取得することができないようです。私がしようとしているのは、ボタンクリックでjingle_add()を実行し、いくつかの計算を実行し、表示を更新し、使用されたツリー値を返し、適切な辞書キーに戻します。 jingle_add()で辞書値を直接呼び出すと、コードを圧縮して、同じ辞書に保存される複数の異なるタイプの値のテンプレートとしてこれを使用しようとしている場合、異なるボタンでそれらを呼び出す。しかし、以下のバージョンのコードでは、実行することができず、明白なエラーはなく、ラムダラインのフラグだけです。私がラムダコールに欠けているもの、または返品で逃したものがありますか?Tkinterボタン内のPythonのdictの値を更新する

data = {'fans': 0, 'jingle': 0, 'jingle_cost': 15} 

jingle_button = Button(win, text = "Make a jingle - +0.1 fans/sec", command = lambda: data['fans'], data['jingle_cost'], data['jingle'] = jingle_add(data['fans'], data['jingle_cost'], data['jingle'])) 

def jingle_add(fans, cost, building): 
    if fans >= cost: 
     fans -= cost 
     cost = round(cost * (1.07**building), 1) 
     building += 1 
     return fans, cost, building 
+0

誰もが望んでいる場合は、次の代替ではなく、関数内でそれが何をするかを定義し、コールバックとしての機能を使用することです私がしようとしていることをより深く理解するための完全なコードを確認するには、github.com/kari-fox/MixxMaster –

答えて

0

現在の形式では、lambda式の割り当てによってコードをコンパイルできません。

def add_to_data(): 
    data['fans'], data['jingle_cost'], data['jingle'] = jingle_add(data['fans'], data['jingle_cost'], data['jingle']) 

jingle_button = Button(win, 
    text = "Make a jingle - +0.1 fans/sec", command = add_to_data) 

command引数として使用する場合add_to_dataは括弧を取らないことに注意してください。)

+0

から入手できます。ありがとうございました。 2番目の定義(別名ラムダを使用せずに何か他のもの)を書かなくても、ボタン割り当て内から具体的に行う方法はありますか? 2番目の定義を書くことは、私が現時点で使用しているコードを組み合わせることには本当に役立ちません。なぜなら、それぞれの辞書キーの下に保存するために使用しているデータ型ごとに別々のadd_to_data関数を持たなければならないからです。 –

+0

どのように一般的である必要があるかによっては、def add_to_target(target、k1、k2、k3):target [k1]、target [k2]、target [k3] = jingle_add(target [k1 ]、target [k2]、target [k3]) 'を実行して、' Button(...、command = lambda:add_to_target(data、 "fans"、 "jingle"、 "cost")) 'を実行します。そうすれば、あなたは1つの機能だけを持ち、各ボタンのラムダは実際のターゲットとキーを指定します。 – Hans

+0

ありがとうございました!それは私が考えていたものでさえありませんでした。私はちょうどコードに追加し、それは完全に働いた。 –

0

可変性の「コスト」がどこから来ているかをご記入ください。その最初のループの中で起こっている場合 そして、何かのチェックを印刷しよう:

if fans >= cost: 

あなたのコードは、あなたがしてループしている値の正しいチェックです。

関連する問題