Menüleiste - Schleife - commands

Fragen zu Tkinter.
Antworten
tobi45f
User
Beiträge: 24
Registriert: Montag 22. Februar 2021, 14:31

Hallo zusammen,

ich würde gern in der Menüleiste meine Optionen verfügbar haben, welche je nach eingelesener Datei unterschiedlich sind. Mit dem Klick auf den Menüeintrag sollte eine Berechnung gestartet werden. Ich verstehe, was passiert und warum es nicht funktioniert, habe allerdings grade keine Ahnung, wie ich auf die korrekte ID/den korrekten Namen zugreifen kann?
Ich habe diese Variante gewählt, da ich keine Möglichkeit gefunden habe, ein Optionsmenü in der Menüleiste einzufügen (ist ja quasi Dasselbe).

Tipps, wie ich das so umsetzen kann? Oder wie ich mein Optionsmenü oben ins Menü rein bekomme? ;)

Grüße Tobias

Code: Alles auswählen

import tkinter as tk
from tkinter import Menu


class Application:
    def __init__(self, options):
        self.window = tk.Tk()
        self.window.title = "test"
        self.window.geometry("600x500")

        menu = Menu(self.window)        
        self.window.config(menu=menu)

        filemenu = Menu(menu)
        menu.add_cascade(label="File", menu=filemenu)
        filemenu.add_separator()
        filemenu.add_command(label="Exit", command=self.window.destroy)

        myOptions = Menu(menu)
        menu.add_cascade(label="values", menu=myOptions)
        for name, id in options:
            myOptions.add_command(label = name, command = lambda: self.calc(id))

    def show(self):
        self.window.mainloop()

    def calc(self, id):
        print(str(id)) #immer nur 123

if __name__ == "__main__":
    OptionList = [
    ("aa", 3453),
    ("bb", 5623),
    ("cc", 234),
    ("dd", 123)
    ] 
    window = Application(OptionList)
    window.show()
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@tobi45f: Was ist denn an `Menu` so anders, dass Du das nicht über `tk` ansprichst, sondern extra noch mal importierst?

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Grunddatentypen haben nichts in Namen verloren. Den Typen ändert man gar nicht so selten mal während der Programmentwicklung und dann muss man überall im Programm die betroffenen Namen ändern, oder man hat falsche, irreführende Namen im Quelltext.

`Tk.title()` ist eine *Methode*. Es hat (offensichtlich) nicht den gewünschten Effekt wenn man dem Attribut eine Zeichenkette *zuweist* und damit die Methode verdeckt.

Um die ID zum Zeitpunkt des erstellens des `command`-Arguments zu binden, kannst Du `functools.partial()` verwenden.

`print()` wandeln die auszugebenden Argumente in Zeichenketten um, das muss man nicht vorher selbst machen.

Da `calc()` dann eigentlich nichs mehr macht als mit den gleichen Argumenten eine andere Funktion aufzurufen, kann man da aus dem Beispiel ”raus kürzen”.

Code: Alles auswählen

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


class Application:
    def __init__(self, options):
        self.window = tk.Tk()
        self.window.title("test")
        self.window.geometry("600x500")

        menu = tk.Menu(self.window)
        self.window.config(menu=menu)

        filemenu = tk.Menu(menu)
        menu.add_cascade(label="File", menu=filemenu)
        filemenu.add_command(label="Exit", command=self.window.quit)

        options_menu = tk.Menu(menu)
        menu.add_cascade(label="values", menu=options_menu)
        for name, id_ in options:
            options_menu.add_command(label=name, command=partial(print, id_))

    def show(self):
        self.window.mainloop()


def main():
    options = [("aa", 3453), ("bb", 5623), ("cc", 234), ("dd", 123)]
    window = Application(options)
    window.show()


if __name__ == "__main__":
    main()
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten