Abhänige Auswahl mit Listbox
Verfasst: Dienstag 16. Mai 2023, 14:16
Hallo liebe Community!
Ich zerbreche mir seit einige Tagen den Kopf, wie ich es schaffe eine abhänige Auswahl zu generieren.
Das soll heißen, ich will eine Vorauswahl mit einer Listbox treffen und anschließend, je nach Vorauswahl, weitere Wahlmöglichkeiten bekommen. Meinen Code seht ihr hier drunter:
import tkinter as tk
root = tk.Tk()
Listbox = tk.Listbox(root, height=3)
Listbox.insert ("end", "A", "B", "C")
Listbox.select_set(0)
Listbox.grid(row=0, rowspan=2, column=0)
Anzeige = tk.Label(root, height=5, width=10, relief="sunken")
Anzeige.grid(row=0, rowspan=2, column=1)
Hoch = tk.Button(root, text="Hoch", command=lambda: Aendern.Auswahl_aendern(1))
Hoch.grid(row=0, column=3)
Runter = tk.Button(root, text="Runter", command=lambda: Aendern.Auswahl_aendern(-1))
Runter.grid(row=1, column=3)
Liste_B = ["1", "2", "3", "4", "5"]
Liste_C = ["V", "W", "X", "Y", "Z"]
class Auswahl():
def __init__(self) -> None:
self.zaehler = 0
self.Liste_Auswahl = ""
self.Liste = []
def Auswahl_reset(self):
self.zaehler = 0
self.Liste_Auswahl = Listbox.get(Listbox.curselection())
if self.Liste_Auswahl == "A":
Anzeige.config(text="Nüscht")
elif self.Liste_Auswahl == "B":
self.Liste = Liste_B
Anzeige.config(text=self.Liste[self.zaehler])
elif self.Liste_Auswahl == "C":
self.Liste = Liste_C
Anzeige.config(text=self.Liste[self.zaehler])
def Auswahl_aendern(self, betrag):
if self.Liste:
self.zaehler += betrag
Anzeige.config(text=self.Liste[self.zaehler])
Aendern = Auswahl()
Listbox.bind("<<ListboxSelect>>", Aendern.Auswahl_reset())
root.mainloop()
Vielleicht seht ihr ja schon sofort das Problem und könnt es mir, möglichst für ganz doofe, erklären.
Ansonsten, schaffe ich es mittels Listbox und ListboxSelect die Vorauswahl anzuzeigen, dazu müsste ich allerdings den Listbox.bind folgendermaßen ändern:
Listbox.bind("<<ListboxSelect>>", Auswahl.Auswahl_reset)
Verzeihung, wenn ich total falschen Syntax benutze, aber ich muss anstatt dem Objekt direkt die Klasse ansprechen, damit die Vorauswahl angezeigt wird und das verstehe ich einfach nicht. Kann mir das einer erklären? Ich habe hin und her probiert, bekomme aber mit Aender.Auswahl_reset() keine Vorauswahl mehr angezeigt. Außerdem gibt es aus irgendeinem Grund die self.Liste bei der Auswahl über Auswahl_reset(), aber wenn ich auf die Liste in Auswahl_aendern() zugreifen will, ist diese plötzlich leer. Das verstehe ich auch nicht.
Die einzelenen Elemente der Listen bekomme ich auch angezeigt, ich bekomme nur irgednwie einfach nicht beides verbunden. Könnt Ihr mir da helfen?
Ich zerbreche mir seit einige Tagen den Kopf, wie ich es schaffe eine abhänige Auswahl zu generieren.
Das soll heißen, ich will eine Vorauswahl mit einer Listbox treffen und anschließend, je nach Vorauswahl, weitere Wahlmöglichkeiten bekommen. Meinen Code seht ihr hier drunter:
import tkinter as tk
root = tk.Tk()
Listbox = tk.Listbox(root, height=3)
Listbox.insert ("end", "A", "B", "C")
Listbox.select_set(0)
Listbox.grid(row=0, rowspan=2, column=0)
Anzeige = tk.Label(root, height=5, width=10, relief="sunken")
Anzeige.grid(row=0, rowspan=2, column=1)
Hoch = tk.Button(root, text="Hoch", command=lambda: Aendern.Auswahl_aendern(1))
Hoch.grid(row=0, column=3)
Runter = tk.Button(root, text="Runter", command=lambda: Aendern.Auswahl_aendern(-1))
Runter.grid(row=1, column=3)
Liste_B = ["1", "2", "3", "4", "5"]
Liste_C = ["V", "W", "X", "Y", "Z"]
class Auswahl():
def __init__(self) -> None:
self.zaehler = 0
self.Liste_Auswahl = ""
self.Liste = []
def Auswahl_reset(self):
self.zaehler = 0
self.Liste_Auswahl = Listbox.get(Listbox.curselection())
if self.Liste_Auswahl == "A":
Anzeige.config(text="Nüscht")
elif self.Liste_Auswahl == "B":
self.Liste = Liste_B
Anzeige.config(text=self.Liste[self.zaehler])
elif self.Liste_Auswahl == "C":
self.Liste = Liste_C
Anzeige.config(text=self.Liste[self.zaehler])
def Auswahl_aendern(self, betrag):
if self.Liste:
self.zaehler += betrag
Anzeige.config(text=self.Liste[self.zaehler])
Aendern = Auswahl()
Listbox.bind("<<ListboxSelect>>", Aendern.Auswahl_reset())
root.mainloop()
Vielleicht seht ihr ja schon sofort das Problem und könnt es mir, möglichst für ganz doofe, erklären.
Ansonsten, schaffe ich es mittels Listbox und ListboxSelect die Vorauswahl anzuzeigen, dazu müsste ich allerdings den Listbox.bind folgendermaßen ändern:
Listbox.bind("<<ListboxSelect>>", Auswahl.Auswahl_reset)
Verzeihung, wenn ich total falschen Syntax benutze, aber ich muss anstatt dem Objekt direkt die Klasse ansprechen, damit die Vorauswahl angezeigt wird und das verstehe ich einfach nicht. Kann mir das einer erklären? Ich habe hin und her probiert, bekomme aber mit Aender.Auswahl_reset() keine Vorauswahl mehr angezeigt. Außerdem gibt es aus irgendeinem Grund die self.Liste bei der Auswahl über Auswahl_reset(), aber wenn ich auf die Liste in Auswahl_aendern() zugreifen will, ist diese plötzlich leer. Das verstehe ich auch nicht.
Die einzelenen Elemente der Listen bekomme ich auch angezeigt, ich bekomme nur irgednwie einfach nicht beides verbunden. Könnt Ihr mir da helfen?