@Bulova: Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.
Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).
Namen sollten keine kryptischen Abkürzungen enthalten. Der Name soll dem Leser vermitteln was der Wert dahinter im Programm bedeutet, nicht zum rätseln zwingen. Das `lb` `Label` und nicht `Listbox` bedeutet, kann man leicht verwechseln, auch gehen die zweibuchstabigen Kürzel ein bisschen Unter wenn gefühlt alles xyAuswahl heisst.
Man muss auch nicht alles an einen Namen binden wenn das dann später gar nicht mehr benötigt wird.
Bei Zeichenketten mit einer festen Bedeutung für Tk für die es im `tkinter`-Modul Konstanten gibt, sollte man diese Konstanten benutzen. Dann weiss man beim Lesen, dass das kein beliebiger Text ist, bei Tippfehlern bekommt man einen `NameError`, meistens schon von der IDE bevor man das ausführt, und bei nicht eindeutigen Werten wie "ns" vs. "sn" gibt es einen kanonischen Wert.
`s` sollte eigentlich `methode` heissen und `methode` sollte eigentlich `methoden`, Mehrzahl, heissen. Die Schleife kann man sich aber auch sparen und gleich mehrere Werte bei `insert()` angeben.
`ende()` ist nicht wirklich notwendig, da könnte man die Methode die aufgerufen werden soll auch gleich als `command` übergeben.
Bei Funktions- und Methodennamen ist es üblich die nach der Tätigkeit zu benennen die sie durchführen, damit der Leser weiss was sie tun und um sie leicht(er) von eher passiven Werten unterscheiden zu können. Bei Rückruffunktionen/-methoden findet man auch das Namensmuster `on_<ereignis>` wo das Ereignis beschrieben wird zu dem der Aufruf passieren soll.
Funktionen und Methoden bekommen alles was sie ausser Konstanten benötigen, als Argumente übergeben. `auswahl()` braucht als das Label und die Listbox als Argumente. Bei so simplen Programmen kommt man noch mit „Closures“ aus, zum Beispiel über `functools.partial()`, bei etwas komplexeren Programmen kommt man nicht um eine Klasse herum.
Eine Möglichleit an die aktuelle Auswahl zu kommen ist die `curselection()`-Methode, die eine Sequenz mit den ausgewählten Indexwerten liefert. Also hier entweder eine leere Sequenz wenn nichts ausgewählt ist, oder eine mit einem Element wenn ein Listeneintrag ausgewählt ist. Damit kann man dann mit `get()` den Wert abfragen.
Code: Alles auswählen
#!/usr/bin/env python3
import tkinter
from functools import partial
def on_output(output_label, choice_listbox):
indices = choice_listbox.curselection()
if indices:
output_label["text"] = choice_listbox.get(indices[0])
def main():
window = tkinter.Tk()
window.title("Bending-Methode")
window.resizable(False, False)
tkinter.Label(window, text="Ihre Auswahl:").grid(
row=0, column=0, sticky=tkinter.W, padx=5, pady=5
)
frame = tkinter.Frame(window)
scrollbar = tkinter.Scrollbar(frame, orient=tkinter.VERTICAL)
choice_listbox = tkinter.Listbox(
frame, height=4, width=25, yscrollcommand=scrollbar.set
)
scrollbar["command"] = choice_listbox.yview
choice_listbox.grid(row=0, column=0)
scrollbar.grid(row=0, column=1, sticky=tkinter.NS)
frame.grid(row=1, column=0, padx=5, pady=5)
choice_listbox.insert(tkinter.END, "Methode 1", "Methode 2", "Methode 3")
output_button = tkinter.Button(window, text="Ausgabe", width=10)
output_button.grid(row=2, column=0, sticky=tkinter.W, padx=5, pady=5)
output_label = tkinter.Label(window, text="(leer)")
output_label.grid(row=3, column=0, sticky=tkinter.W, padx=5, pady=5)
tkinter.Button(window, text="Ende", command=window.quit, width=10).grid(
row=4, column=2, padx=5, pady=5
)
output_button["command"] = partial(on_output, output_label, choice_listbox)
window.mainloop()
if __name__ == "__main__":
main()