Seite 1 von 1

Listbox auslesen

Verfasst: Freitag 27. November 2020, 21:42
von saxopraxo
Hallo,

ich habe eine Frage zu einem einfachen, aber für mich schwierigen Problem.
Ich habe ein kleines Programm mit einer Listbox. Das Programm habe ich aus dem Buch „Einstieg in Python“ ein wenig vereinfacht.


import tkinter

#Funktion zum anzeigen in Anzeigelabel
def anzeigen():
lb["text"]="Auswahl: " + li.get("active") #li=listbox

#Hauptprogramm
main=tkinter.Tk()

#Listbox mit 3 Elementen
li=tkinter.Listbox(main,height=0)
'li=tkinter.Listbox(main,height=0,selectmode="single")'
li.insert("end","Hamburg")
li.insert("end","Stuttgart")
li.insert("end","Leipzig")
li.pack()

#Auswahlanzeige
bshow=tkinter.Button(main,text="Anzeigen", command=anzeigen)
bshow.pack()

#Anzeigelabel
lb=tkinter.Label(main,text="Auswahl:...")
lb.pack()

#Endlosschleife
main.mainloop()


Ich habe bisher nicht herausgefunden, steht auch so nicht konkret im Buch, wie ich jetzt das selektierten Element in der Listbox herausziehen kann, um damit weiter arbeiten zu können.
Wie erfolgt die Zuweisung in eine neue Variable, in der das selektierte Element steht?

Gruß

Re: Listbox auslesen

Verfasst: Freitag 27. November 2020, 23:08
von __blackjack__
@saxopraxo: Der Code liest doch bereits das aktivierte Element aus und setzt es in einen Text in ein Label. Statt den Wert dort in das Label zu setzen kannst Du natürlich auch andere Dinge damit anstellen.

Die Namensgebung in dem Quelltext ist ziemlich schlecht. Namen sollen dem Leser vermitteln was der Wert hinter dem Namen im Programm bedeutet. Kryptische Abkürzungen wie `li`, `bshow`, und `lb` tun das sicher nicht. Besonders unsinnig wird es dann wenn man superkurze Namen wie `li` verwendet, ich vermute mal um Buchstaben zu sparen (obwohl die gar nicht knapp sind) und dann in einem Kommentar den kurzen Namen erklärt, was letztlich mehr Zeichen verwendet als wenn man den Namen gleich sinnvoll gewählt hätte, so dass man den Kommentar nicht braucht.

Kommentare sollen dem Leser einen Mehrwert über den Code geben. Faustregel: Kommentare beschreiben nicht *was* der Code macht, denn das steht da bereits als Code, sondern warum er das macht. Sofern das nicht offensichtlich ist. Offensichtlich ist in aller Regel auch was in der Dokumentation von Python und den verwendeten Bibliotheken steht.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. So heisst hier schon das `Tk`-Objekt, was wieder eine Abkürzung ist, denn ausgeschrieben wäre es ja das `main_window`.

Aus keine Variablen auf Modulebene folgt, dass Funktionen und Methoden alles was sie als ausser Konstanten benötigen als Argument(e) übergeben bekommen. Was bei so ziemlich jedem nicht-trivialen GUI-Programm bedeutet, dass man eigene Klassen schreiben muss.

Zeichenketten sind nicht zum auskommentieren von Code gedacht. Das Kommentarzeichen ist ``#``.

Bei Zeichenketten wie "active" oder "end" für die es im `tkinter`-Modul Konstanten gibt, sollte man diese Konstanten auch verwenden.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from functools import partial


def anzeigen(listbox, label):
    label["text"] = "Auswahl: " + listbox.get(tk.ACTIVE)


def main():
    main_window = tk.Tk()

    listbox = tk.Listbox(main_window, height=0)
    listbox.insert(tk.END, "Hamburg", "Stuttgart", "Leipzig")
    listbox.pack()

    show_button = tk.Button(main_window, text="Anzeigen")
    show_button.pack()

    label = tk.Label(main_window, text="Auswahl:...")
    label.pack()

    show_button["command"] = partial(anzeigen, listbox, label)
    main_window.mainloop()


if __name__ == "__main__":
    main()

Re: Listbox auslesen

Verfasst: Samstag 28. November 2020, 17:45
von saxopraxo
Hallo, danke für dein Infos und Erläuterung. Ich werde deine Hinweise jetzt mal verarbeiten und wenn ich Probleme habe, dann melde ich wieder.
Vielen Dank.

Re: Listbox auslesen

Verfasst: Sonntag 29. November 2020, 18:20
von saxopraxo
Die Namen der Variablen sind so in dem Buch enthalten. Ich hatte das Programm nur ein wenig vereinfacht.
Ich habe in der Funktion "anzeigen" die Variable "element" erstellt. Jetzt kann ich damit in der Funktion "anzeigen" damit arbeiten.
Meine Frage ist nun dahingehend: Wie bekomme ich die Variable "element" oder den Inhalt der Variablen aus der Funktion "anzeigen" raus,
damit ich ausserhalb damit arbeiten oder diese in der Funktion "main" benutzen kann.

import tkinter as tk
from functools import partial

def anzeigen(listbox, label):
label["text"] = "Auswahl: " + listbox.get(tk.ACTIVE)
element=listbox.get(tk.ACTIVE)

def main():
main_window = tk.Tk()

listbox = tk.Listbox(main_window, height=0)
listbox.insert(tk.END, "Hamburg", "Stuttgart", "Leipzig")
listbox.pack()

show_button = tk.Button(main_window, text="Anzeigen")
show_button.pack()

label = tk.Label(main_window, text="Auswahl:...")
label.pack()

show_button["command"] = partial(anzeigen, listbox, label)
main_window.mainloop()

if __name__ == "__main__":
main()

Re: Listbox auslesen

Verfasst: Sonntag 29. November 2020, 18:38
von Sirius3
So funktionieren GUI-Programme nicht. Man kann nicht irgendetwas rausholen und es wird auch nichts sequenziell in `main` gemacht. GUI-Programme reagieren auf Ereignisse und verarbeiten diese, also die Funktionalität steckt in `anzeigen`, wenn etwas gemacht werden soll, nachdem ein Knopf gedrückt wurde.

Re: Listbox auslesen

Verfasst: Sonntag 29. November 2020, 19:46
von saxopraxo
Danke. Verstanden.