Checkbutton funktioniert nicht richtig?

Fragen zu Tkinter.
Antworten
anonym96

Hallo
Also als erstes erkläre ich kurz was ich gemacht habe:
Ich habe eine Klasse erstellt die wenn man sie aufruft ein Objekt erzeugt was ein Frame ist mit widgets.Es ist also ein Fenster im Fenster wo drüber man Einstellungen treffen kann.Dieses Fenster hat ein Checkbutton der einfach dafür da ist um das Design zu bestimmen.Das standart Design ist dunkel wer dies also ändern will brauch einfach nur dort ein Häkchen zu setzen.Dies funktioniert auch.Das Design ändert sich wenn das Häkchen drin ist oder wenn es wieder entfernt wird.Damit man nicht alles immer wieder neu einstellen brauch wird der Status true oder false der variable die der Checkbutton benutzt in einer JSON Datei gespeichert und die Variable bleibt auf true oder false auch wenn man des objekt zerstört (das Fenster zumacht)und dann wieder ein neues erzeugt (das Fenster neu öffnet).Das komische ist nur das design des Objekts bleibt nicht geändert und das Häkchen nicht drin abwohl die Variable schon beim erzeugen des objektes auf true steht wegen der JSON Datei.Was komisch ist da ja in der def designänder
if check.get(): zutrifft weil wenn ich nämlich drauf drücke bekomme ich auch nicht an sondern aus geprintet(habe um sowas zuprüfen extra zwei print Befehle hinzugefügt ) weil die variable ja schon beim erzeugen auf true steht
Was ist nur das Problem?
Bitte helft mir
Die Designändern Methode

Code: Alles auswählen

def designändern(self):
        if self.hellcheck.get():
            print ("an")
            self["bg"]="#757272"
            for label in self.labels:
                label["bg"]="#757272"
            self["highlightbackground"]="#473b3b"
            self.überschriftE["bg"]="#473b3b"
            for button in self.buttons:
                button["bg"]="#5f5f5f"
            self.hell["fg"]="#000000"
            self.hell["bg"]="#757272"
        else:
            print ("aus")
            self["bg"]="#342f2f"
            for label in self.labels:
                label["bg"]="#342f2f"
            self["highlightbackground"]="#201919"
            self.überschriftE["bg"]="#201919"
            for button in self.buttons:
                button["bg"]="#3b3a3a"
            self.hell["fg"]="#ffffff"
            self.hell["bg"]="#342f2f"
Die Methode wo die Variable in die JSON gespeichert wird(sie ist der Command eines Buttons)

Code: Alles auswählen

def übernimm(self):
        with open("settings.json","w")as f:
                settings = {
                "hellcheck": self.hellcheck.get()
              }
                json.dump(settings,f)
Im Konstrukter der Klasse steht dann das wo das der JSON wieder die Variable bekommt

Code: Alles auswählen

with open ("settings.json","r")as f:
            settings=json.loads(f.read())
            settings["hellcheck"]
            self.loadSettings(settings)
            
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Du musst die Variable nach dem Einlesen setzen.
variable.set(True or Fasle)
anonym96

@peterpy das wird sie doch durch der Methode loadSettings(settings)(schuldige mein Fehler das was jetzt kommt habe ich ausversehen nur nicht mit markiert das kommt nämlich direkt unter dem wo eingelesen wird )

Code: Alles auswählen

def loadSettings(self,settings):
        self.hellcheck.set(settings["hellcheck"])
        
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hast Du das mal überprüft oder glaubst Du das nur? Was ist denn an der Stelle *tatsächlich* Wert und Typ von dem was da an `set()` übergeben wird?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo SvKaGli,

sorry, ich war gestern in Eile.
Mit Checkbutton.select() wird der Checkbutton gesetzt, mit .deselect() abgewählt.

Gruss
Peter
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@peterpy: Wir haben hier ja ein von `tkinter.Variable` abgeleitetes Objekt. Wenn das den richtigen Typ hat und richtig mit dem `Checkbutton` verbunden ist, dann braucht man den `Checkbutton` selbst dafür ja gar nicht anfassen und das sollte durch setzen des Wertes so wie gezeigt funktionieren. Aber da ist ja immer noch Code den wir nicht kennen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
anonym96

gelöscht
Zuletzt geändert von anonym96 am Donnerstag 25. Juni 2020, 09:13, insgesamt 2-mal geändert.
anonym96

@__blackjack___ hier die gesamte Class

Code: Alles auswählen

import tkinter as tk
import json

class Einstellungsscreen(tk.Frame):
    def __init__(self, master):
        super().__init__(master)
        self.buttons=[]
        self.labels=[]
        self["bg"]="#342f2f"
        self["highlightbackground"]="#201919"
        self["highlightthickness"]=3
        self.place(x=43)
        self.createWidgets()
        with open ("settings.json","r")as f:
            settings=json.loads(f.read())
            settings["hellcheck"]
            self.loadSettings(settings)
    def loadSettings(self,settings):
        self.hellcheck.set(settings["hellcheck"])
    def createWidgets(self):
        self.überschriftE=tk.Label(self)
        self.überschriftE["text"]="Einstellungen"
        self.überschriftE["bg"]="#201919"
        self.überschriftE["width"]=25
        self.überschriftE.place(x=0)
        self.schliessenIcon=tk.PhotoImage(file="Grafiken/Buttons/Schliessen.png")
        self.schliessen=tk.Button(self)
        self.schliessen["image"]=self.schliessenIcon
        self.schliessen["bg"]="#3b3a3a"
        self.schliessen["command"]=self.zumachen
        self.buttons.append(self.schliessen)
        self.schliessen.grid(sticky="ne",column=1)
        self.sprache=tk.Label(self)
        self.sprache["bg"]="#342f2f"
        self.sprache["text"]="Sprachauswahl:"
        self.labels.append(self.sprache)
        self.sprache.grid(sticky="w")
        self.lautstärke=tk.Label(self)
        self.lautstärke["bg"]="#342f2f"
        self.lautstärke["text"]="Lautstärke anpassen:"
        self.labels.append(self.lautstärke)
        self.lautstärke.grid(sticky="w")
        self.design=tk.Label(self)
        self.design["bg"]="#342f2f"
        self.design["text"]="Designauswahl:"
        self.labels.append(self.design)
        self.design.grid(sticky="w")
        self.hell=tk.Checkbutton(self)
        self.hell["text"]="hell"
        self.hell["bg"]="#342f2f"
        self.hell["fg"]="#ffffff"
        self.hellcheck=tk.BooleanVar()
        self.hell["variable"]=self.hellcheck
        self.hell["command"]=self.designändern
        self.hell.grid(row=3,column=1)
        self.schwierigkeit=tk.Label(self)
        self.schwierigkeit["text"]="Schwierigkeit:"
        self.schwierigkeit["bg"]="#342f2f"
        self.labels.append(self.schwierigkeit)
        self.schwierigkeit.grid(sticky="w")
        self.übernehmen=tk.Button(self)
        self.übernehmen["text"]="Übernehmen"
        self.übernehmen["bg"]="#3b3a3a"
        self.übernehmen["command"]=self.übernimm
        self.übernehmen.grid(sticky="e",column=1)
        self.buttons.append(self.übernehmen)
    def designändern(self):
        if self.hellcheck.get():
            print ("an")
            self["bg"]="#757272"
            for label in self.labels:
                label["bg"]="#757272"
            self["highlightbackground"]="#473b3b"
            self.überschriftE["bg"]="#473b3b"
            for button in self.buttons:
                button["bg"]="#5f5f5f"
            self.hell["fg"]="#000000"
            self.hell["bg"]="#757272"
        else:
            print ("aus")
            self["bg"]="#342f2f"
            for label in self.labels:
                label["bg"]="#342f2f"
            self["highlightbackground"]="#201919"
            self.überschriftE["bg"]="#201919"
            for button in self.buttons:
                button["bg"]="#3b3a3a"
            self.hell["fg"]="#ffffff"
            self.hell["bg"]="#342f2f"
    def übernimm(self):
        with open("settings.json","w")as f:
            settings = {
            "hellcheck": self.hellcheck.get()
           }
            json.dump(settings,f)
    def zumachen(self):
        self.destroy()
        if self.onClose:
            self.onClose()
    def setOnClose(self, funktion):
        self.onClose = funktion
        
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo SvKaGli
hast Du eine Diskrepanz zwischen dem json Eintrag und dem effektiven Status,
setze ein beherztes

Code: Alles auswählen

self.hell.invoke()
ab.

Gruss Peter
anonym96

@peterpy
Würdes du mir das kurz erklären?Invoke ist für mich neu.
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

Hallo SvKaGli,
vergiss das self.hell.select() und das self.hellcheck.set(True)

Wenn der Checkbutton neu erstellt wird, hat die Variable self.hellcheck den Wert False.
Du liest den Wert aus der json Datei und prüfst ob dieser wahr oder falsch ist.
Ist der json Wert True, dann setz das self.hell.invoke() ab und der Checkbutton hat den Hacken.
Willst Du mehr Infos, schau mal hier:https://anzeljg.github.io/rin2/book2/24 ... utton.html
Gruss Peter
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@peterpy: Das ist IMHO der falsche Weg Werte zu setzen in dem man per Programm die GUI bedient.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
peterpy
User
Beiträge: 188
Registriert: Donnerstag 7. März 2013, 11:35

@__blackjack__: aber das ist doch das was SvKaGl wünscht.
Antworten