Ich verwende das Buch "Python 3 - Das umfassende Handbuch" und habe ein folgendes Codebeispiel, wo ich eine Sache nicht verstehe:
import tkinter
class MyApp(tkinter.Frame):
def __init__(self, master):
super().__init__(master)
self.pack()
self.list = ["Linux", "macOS", "Windows"]
self.var = tkinter.StringVar()
self.var.set("Linux")
self.op = tkinter.OptionMenu(self, self.var, *self.list, command=self.handler)
self.op.pack()
def handler(self, text):
print(text)
root = tkinter.Tk()
app = MyApp(root)
app.mainloop()
Wenn ich hier das OptionMenu erstelle, gebe ich als command die Methode 'self.handler' an. 'self.handler' benötigt einen Parameter 'text'. Ich verstehe nicht ganz, wie ich den Parameter übergebe. Geprinted wird entweder 'Linux', 'macOS' oder 'Windows', kommt darauf an, welche Option im OptionMenu ausgewählt ist. Ich verstehe nicht genau, wieso. Kann mir jemand helfen?
Vielen Dank
Übergebener Parameter?
- __blackjack__
- User
- Beiträge: 13107
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@leif is leif: Du übergibst den Parameter gar nicht. Der wird für Dich übergeben. Vom `OptionMenu` immer dann wenn der Benutzer die Auswahl ändert. Das ist halt so programmiert das es das macht.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
@leif is leif: zum Code. GUI-Elemente sollten sich nicht selbst positionieren, das ist Aufgabe der übergeordneten Instanz, hier also das Hauptfenster; denn so kannst Du den Frame nur im pack-Layout verwenden und nicht mit Grid. Du bindest viel zu viele Objekte an Instanzen. Eigentlich ist nur der StringVar nötig. Wenn man schon ein StringVar benutzt, dann sollte man dort die Änderungen verfolgen, statt die Änderung des OptionsMenu, das ist flexibler. Die letzten drei Zeilen gehören eigentlich auch in eine Funktion:
Code: Alles auswählen
import tkinter as tk
class OptionsApp(tk.Frame):
def __init__(self, master):
super().__init__(master)
options = ["Linux", "macOS", "Windows"]
self.var = tk.StringVar(self, options[0])
self.var.trace('w', self.handler)
tk.OptionMenu(self, self.var, *options).pack()
def handler(self, _name, _, _mode):
print(self.var.get())
def main():
root = tk.Tk()
app = OptionsApp(root)
app.pack()
root.mainloop()
if __name__ == '__main__':
main()