Lambda Rückgabe

Fragen zu Tkinter.
Antworten
Boardgameingo
User
Beiträge: 10
Registriert: Dienstag 29. März 2022, 11:26

Ich habe eine Frage zu Lambda.
Mit folgender Zeile nehme ich x und y und schicke sie an eine Funktion, die mir den dest_name und die Werte zurückgeben soll. Als Fehler erhalte ich: ValueError: too many values to unpack (expected 3). Warum bekomme ich nicht nur die drei aus der Return Anweisung zurück und was bekomme ich statt dessen??
Vielen Dank vorab für eure Mühe!

x, y, dest_name = map_01.bind('<ButtonPress-1>', lambda e: self.catch_it (e.x, e.y) )

def catch_it(self,x ,y )
if 40 <= x < 240 and 0 <= y < 445 :
dest_name = 'loc_01'
...
return ( x,y, dest_name)
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie stellst du dir das denn vor? Dein lambda soll doch bei Knopfdruck ausgefuehrt werden. Also lange, nachdem diese Zeile durchgelaufen ist. Wie also genau soll denn dann das return schon zu dem Zeitpunkt passieren, mit Ergebnissen aus einer fernen Zukunft?

Der Rueckgabewert von bind hingegen ist einfach None. Also kann man den auch nicht drei anderen Werten zuweisen.

Grundsaetzlich kann kein event-basiertes System sowas. Denn die Ereignisschleife laeuft ja irgendwo, nicht and den potentiell hunderten Stellen, an denen du Ereignis-Handler registriert hast.
Benutzeravatar
__blackjack__
User
Beiträge: 13080
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Kleine aber nicht so wirklich wichtige Korrektur: `bind()` liefert eine Zeichenkette, darum auch „too many values to unpack“ die man mit `unbind()` verwenden kann um diese Bindung wieder aufzuheben. Das ändert aber nichts an dem was __deets__ zum Programmablauf/Zeitpunkt gesagt hat.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Boardgameingo
User
Beiträge: 10
Registriert: Dienstag 29. März 2022, 11:26

OK, meine Lösung geht nicht. Gibts denn eine Alternative? Ich möchte, dass beim Knopfdruck der Wert gespeichert wird und ich ihn weiter verwenden kann. Der Wert soll sich aus dem Eventergebnis zu dem jeweiligen Zeitpunkt ergeben. Das muss doch machbar sein?!?

Genauer: ich möchte durch Klic auf eine Karte einen Ort festlegen (x,y Koordinate) und diese zwei Werte speichern, damit ich sie weiter verwenden kann..
Benutzeravatar
Dennis89
User
Beiträge: 1153
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du kannst das "Ergebnis" an 'self' binden und somit wieder darauf zugreifen. Also zumindest in deinem Codeausschnitt steht 'self', dann geh ich davon aus das du eine Klasse verwendet hast?

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Boardgameingo
User
Beiträge: 10
Registriert: Dienstag 29. März 2022, 11:26

Vielen Dank, ich komme damit weiter. .. Weiter zur nächsten Frage :)

Code: Alles auswählen

            butt_go = tk.Button(frame_03) ,  text='Go - Drive to Destination', command=lambda :  self.go_drive (day))
            butt_go.grid(column=1, row=15, padx = 5, pady=5, sticky = 'w')

    def go_drive (self, day):
        self.destroy
        self.window_03 = Window_03(day)

Ich möchte, dass sich das alte Fenster Windows_02 schließt und das neue sich öffnet. Leider ignoriert er den self.destroy Befehl. Woran kann das liegen?
BG
Ingo
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo Ingo,,

Code: Alles auswählen

self. Windows_02.destroy()
Gruss Peter
Boardgameingo
User
Beiträge: 10
Registriert: Dienstag 29. März 2022, 11:26

Danke
Antworten