Hallo ihr Lieben!
Ich bin gerade auf eine Frage gestoßen, die ich mir nicht selbst beantworten kann und hoffe auf eure Hilfe.
Nachfolgend der Code:
root = tk.Tk()
Listbox = tk.Listbox(root)
Listbox.insert ("end", "A", "B", "C")
Listbox.pack()
Label = tk.Label(root)
Label.pack()
def Auswahl(event):
a = Listbox.get(Listbox.curselection())
Label.config(text=str(a))
Listbox.bind("<<ListboxSelect>>", Auswahl)
root.mainloop()
Warum ist es notwendig in der Funktion "Auswahl" etwas in die Klammer zu schreiben um keinen Fehler zu generieren?
<<ListboxSelect>>
- __blackjack__
- User
- Beiträge: 13931
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassennamen (PascalCase).
`auswahl` wäre ein guter Name für einen Wert der eine Auswahl repräsentiert, aber nicht für eine Funktion. Funktionen (und Methoden) werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit man sie von eher passiven Werten unterscheiden kann. Bei Rückruffunktionen die eine Ereignisbehandlung machen, ist auch das Muster `on_«ereignisname»`, also beispielsweise `on_select()`.
Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptrogramm steht üblicherweise in einer Funktion die `main()` heisst.
Funktionen bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben.
Das heisst `auswahl()` beziehungsweise `on_select()` braucht mindestens noch das Label als Argument. Auf die Listbox könnte man über das bereits vorhandene Ereignisargument zugreifen.
`auswahl` wäre ein guter Name für einen Wert der eine Auswahl repräsentiert, aber nicht für eine Funktion. Funktionen (und Methoden) werden üblicherweise nach der Tätigkeit benannt die sie durchführen, damit man sie von eher passiven Werten unterscheiden kann. Bei Rückruffunktionen die eine Ereignisbehandlung machen, ist auch das Muster `on_«ereignisname»`, also beispielsweise `on_select()`.
Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptrogramm steht üblicherweise in einer Funktion die `main()` heisst.
Funktionen bekommen alles was sie ausser Konstanten benötigen, als Argument(e) übergeben.
Das heisst `auswahl()` beziehungsweise `on_select()` braucht mindestens noch das Label als Argument. Auf die Listbox könnte man über das bereits vorhandene Ereignisargument zugreifen.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter as tk
from functools import partial
def on_select(label, event):
listbox = event.widget
label["text"] = listbox.get(listbox.curselection())
def main():
root = tk.Tk()
listbox = tk.Listbox(root)
listbox.pack()
listbox.insert(tk.END, "A", "B", "C")
label = tk.Label(root)
label.pack()
listbox.bind("<<ListboxSelect>>", partial(on_select, label))
root.mainloop()
if __name__ == "__main__":
main()
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
— Scott Bellware
Erstmal vielen Dank für die Antworten. Ich bin leider noch relativ frisch in Python bzw. in der Programmierung generell.
@blackjack: Danke für deine ausführliche Erklärung. Das war mir so noch nicht bekannt. Diese Art der Programmierung fällt mir, zugegeben, auch noch etwas schwer vom Verständnis. Ich werde das aber künftig mehr probieren.
@deets: Danke für die Erklärung. So ganz hab ich es noch nicht verstanden. Wäre die Funktion "Auswahl" die Rückruffunktion? So ganz habe ich noch nicht verstanden warum "def Auswahl():" nicht funktioniert. Ich beziehe mich ja im Code nirgends auf "event".
@blackjack: Danke für deine ausführliche Erklärung. Das war mir so noch nicht bekannt. Diese Art der Programmierung fällt mir, zugegeben, auch noch etwas schwer vom Verständnis. Ich werde das aber künftig mehr probieren.
@deets: Danke für die Erklärung. So ganz hab ich es noch nicht verstanden. Wäre die Funktion "Auswahl" die Rückruffunktion? So ganz habe ich noch nicht verstanden warum "def Auswahl():" nicht funktioniert. Ich beziehe mich ja im Code nirgends auf "event".
Eine Rückruffunktion ist eine Funktion, die man einer anderen Funkion übergibt, damit diese die erste Funktion aufrufen kann, um bestimmte Dinge zu tun.
In Deinem Fall rufst Du `bind` mit der Rückruffunktion `Auswahl` auf, damit das TkInter-Framework diese Funktion aufrufen kann, wenn sich was an der Listbox geändert hat.
Welche Parameter die Rückruffunktion haben muß, legt `bind` fest, denn das erwartet als Argument eine Funktion mit einem Parameter (event). Wenn Du diese Erwartung nicht erfüllst, sagt `bind`: "mit dieser Art Funktion kann ich nichts anfangen" und bricht mit einem Fehler ab.
In Deinem Fall rufst Du `bind` mit der Rückruffunktion `Auswahl` auf, damit das TkInter-Framework diese Funktion aufrufen kann, wenn sich was an der Listbox geändert hat.
Welche Parameter die Rückruffunktion haben muß, legt `bind` fest, denn das erwartet als Argument eine Funktion mit einem Parameter (event). Wenn Du diese Erwartung nicht erfüllst, sagt `bind`: "mit dieser Art Funktion kann ich nichts anfangen" und bricht mit einem Fehler ab.
Hallo,
genau, das meinte __deets__ auch mit folgendem Satz: (wenn ich das mal so sagen darf)
Grüße
Dennis
genau, das meinte __deets__ auch mit folgendem Satz: (wenn ich das mal so sagen darf)
Wenn du es brauchst kannst du es benutzen und wenn nicht, tust du einfach so, als ob es nicht da sein.
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]