Checkbutton - dynamisch erzeugt, default-Wert

Fragen zu Tkinter.
Antworten
Terahnee
User
Beiträge: 13
Registriert: Dienstag 8. August 2017, 13:48

Hallo zusammen,

ich möchte, dass der Benutzer wählen kann welche Produktkategorien angezeigt bzw. berücksichtigt werden. Um das zu erreichen, stelle ich mir ein Menü bestehend aus einem Checkbutton pro Kategorie vor. Die Status dieser Checkbuttons sollen auch nach Beenden des Programms erhalten bleiben - also gespeichert werden, damit sie bei Programmstart entsprechend vorbelegt werden. Da ich an anderer Stelle bereits mit JSON arbeite, bietet es sich an das hier auch zu verwenden, um eine Art Konfigurationsdatei zu erstellen, denke ich.
Es ist mir nicht so wichtig, dass die Kategorien direkt nach Klick auf den Checkbutton angezeigt bzw. nicht mehr angezeigt werden. Nach einem Neustart des Programms reicht vollkommen, da bestimmte Kategorien saisonbedingt eventuell wochenlang nicht gebraucht werden.
Die Checkbuttons sollen zudem auch noch dynamisch generiert werden, da eventuell mal eine Kategorie hinzukommen kann.
Gehen wir mal davon aus das Ganze würde schon funktionieren und hätte eine Konfigurationsdatei "settings.txt" erzeugt. Der Benutzer braucht derzeit also nur die Kategorien "Äpfel" und "Kartoffeln".
Der Inhalt meiner "settings.txt" lautet testweise:

Code: Alles auswählen

{"categories":{"Äpfel": 1, "Birnen": 0, "Kartoffeln": 1}}
Wie generiere ich jetzt das oben erwähnte Menü und setze den entsprechenden "Default"-Wert?
Mein Ansatz dazu:

Code: Alles auswählen

# Konfiguration lesen
file = open("settings.txt", "r")
settings = json.load(file)
file.close()
checkbuttons = {}
for category in settings["categories"]:
    self.var = tk.IntVar()
    checkbuttons[category] = self.var
    checkbuttons[category].set(1)
    show_category_menu.add_checkbutton(label=category, variable=checkbuttons[category])
Ich habe hier bewusst erstmal jeden Eintrag mit einer 1 versehen, um zu gucken, ob es überhaupt so geht. Allerdings bekommt so immer nur der letzte Checkbutton einen Haken. Wo liegt mein Fehler? In checkbuttons steht hinterher:

Code: Alles auswählen

{'Äpfel': <tkinter.IntVar object at 0x03B69910>, 'Birnen': <tkinter.IntVar object at 0x03B69930>, 'Kartoffeln': <tkinter.IntVar object at 0x03B69970>}
Vielen Dank für die Mühe im Voraus!
Terahnee
User
Beiträge: 13
Registriert: Dienstag 8. August 2017, 13:48

Ich habe es mittlerweile selbst lösen können:

Code: Alles auswählen

        self.checkbuttons = {}
        for category in settings["categories"]:
            self.var = tk.IntVar()
            self.checkbuttons[category] = self.var
            self.checkbuttons[category].set(settings["categories"][category])
            show_category_menu.add_checkbutton(label=category, variable=self.checkbuttons[category], command=lambda: update_settings())
So verhält es sich genau so wie ich es mir gedacht habe.
Antworten