2016-06-21 3 views
1

Ich versuche, Code für ein Spiel mit Python zu schreiben, und scheint nicht in der Lage zu sein, meine Variablen aus dem Button-Befehl in die Wörterbuchvariablen zur späteren Verwendung zu bringen . Was ich versuche, ist, jingle_add() bei einem Klick auszuführen, einige Berechnungen ausführen zu lassen, die Anzeigen zu aktualisieren und die verwendeten Baumwerte zurück in die entsprechenden Wörterbuchschlüssel zu bringen. Ich kann den Code zum Funktionieren bringen, wenn ich in der jingle_add() die Wörterbuchwerte direkt anrufe, aber ich versuche, meinen Code zu komprimieren und diesen als eine Vorlage für mehrere verschiedene Arten von Werten zu verwenden, die in demselben Wörterbuch gespeichert werden, sie mit verschiedenen Knöpfen anruft. Mit der unten stehenden Version des Codes kann ich sie jedoch überhaupt nicht ausführen und es werden keine offensichtlichen Fehler angezeigt, nur ein Flag an der Lambda-Zeile. Gibt es etwas, das mir beim Lambda-Aufruf fehlt oder etwas, das ich bei der Rückkehr vermisst habe?Aktualisieren von Werten in einem Dict auf Python innerhalb einer Tkinter-Schaltfläche

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

Wenn jemand will, Um den vollständigen Code zu sehen, um ein besseres Verständnis dessen zu bekommen, was ich versuche, ist es unter github.com/kari-fox/MixxMaster verfügbar. –

Antwort

0

In seiner aktuellen Form kann der Code aufgrund der Zuweisung im Ausdruck lambda nicht kompiliert werden. Eine Alternative wäre, zu definieren, was das bedeutet in einer Funktion statt und die Funktion als Callback verwenden:

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) 

(Beachten Sie, dass add_to_data nicht Klammern dauert, wenn sie als command Argument verwendet.)

+0

Danke, darum habe ich mir Sorgen gemacht. Gibt es eine Möglichkeit, dies gezielt aus der Tastenbelegung heraus zu tun, ohne eine zweite Definition schreiben zu müssen (aka, nicht mit Lambda, sondern mit etwas anderem)? Das Schreiben einer zweiten Definition wird nicht wirklich helfen, den Code zu kombinieren, den ich gerade benutze, denn dann muss ich eine separate Funktion add_to_data für jeden Datentyp haben, den ich benutze, um sie unter ihren jeweiligen Wörterbuchschlüsseln zu speichern. –

+0

Je nachdem, wie allgemein es sein muss, sollte es funktionieren, um etw zu verwenden wie 'def add_to_target (Ziel, k1, k2, k3): Ziel [k1], Ziel [k2], Ziel [k3] = jingle_add (Ziel [k1 ], target [k2], target [k3]) 'und dann' Button (..., command = lambda: add_to_target (Daten, "fans", "jingle", "cost")) '. Auf diese Weise würden Sie nur eine Funktion haben, und das Lambda in jeder Taste würde das tatsächliche Ziel und die Schlüssel angeben. – Hans

+0

Vielen Dank! Das war nicht einmal etwas, an das ich gedacht hätte. Ich habe es einfach zum Code hinzugefügt und es hat perfekt funktioniert. –

0

Bitte erwähnen Sie, woher erhalten Sie Variable "Kosten". und versuchen, etwas Scheck zu drucken, wenn seine in der ersten Schleife gehen:

if fans >= cost: 

Ihr Code korrekt Prüfung für die Werte Ihrer mit Looping werden.

Verwandte Themen