Übergebener Parameter?

Fragen zu Tkinter.
Antworten
leif is leif
User
Beiträge: 1
Registriert: Donnerstag 19. Juli 2018, 17:23

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
Benutzeravatar
__blackjack__
User
Beiträge: 13004
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Antworten