Einstellungen bleiben nicht

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

Code: Alles auswählen

    def ladeEinstellung(self): 
        if Path(pfad / 'ini/Einstellung.ini').exists():                   
            Inhalt=open(pfad / 'ini/Einstellung.ini').readlines()
            for i in Inhalt:
                if i in "Laden=1":
                    self.Einstellung.chkBox_InfosLaden.setChecked(True)
                if i in "WebScraping=1":
                    self.Einstellung.chkBox_WebScraping.setChecked(True)
                if i in "Speichern=1":
                    self.Einstellung.chkBox_Speichern.setChecked(True)
zuvor geladen mit

Code: Alles auswählen

self.Einstellung = uic.loadUi(os.path.join(Path(__file__).absolute().parent / "ui/Einstellungen.ui"))
wenn ich dann per button auf

Code: Alles auswählen

    def Einstellungen(self):                
        self.Einstellung.Btn_OK.clicked.connect(self.Zurueck)
        self.Einstellung.exec_()
zeigt er mir keine gesetzen checkboxen an.
nur in den def Einstellungen, wenn ich da setChecked(True) setze, dann sind die gesetzt
Warum erst da ich hab die doch gesetzt
er gibt mir ja auch kein fehler aus.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Ernie1412: Ausser der letzten Zeile aus der Datei *kann* keine Zeile in Zeichenketten ohne Zeilenendezeichen vorkommen. Und normalerweise auch nicht einmal die letzte Zeile wenn man jede Zeile sauber mit einem Zeilenendezeichen beendet.

Diese Bedingungen sind auch total verquer formuliert. Denn nehmen wir mal an das Problem mit den Zeilenendezeichen würde nicht besthen, dann könnte man eine Zeile mit einem "=" oder eine in der einfach nur der Buchstabe "n" steht haben und das würde alle Häkchen setzen, weil diese beide Zeichen in jeder der drei Zeichenketten vorkommt.

Sonstiges: Laut Code muss `pfad` ein `Path`-Objekt sein, darum ist das nochmalige verpacken in ein `Path`-Objekt sinnlos.

Warum verwendest Du `Path`-Objekte und versemmelst die Vorteile dann doch wieder mit fest kodiertem Pfadtrenner in einer Zeichenkette?

`pfad` kommt einfach aus dem nichts und ist recht nichtssagend benannt. Also Konstante (hoffentlich‽) sollte der Name auch KOMPLETT_GROSS geschrieben sein.

Der Test auf Existenz der Datei ist unpythonisch. Öffne die Datei und reagiere entsprechend auf die Ausnahme. Da nichts gemacht wird wenn die Datei nicht existiert, braucht man da auch nichts weiter machen als einfach nur das ``if`` weglassen.

Dateien die man öffnet, sollte man auch wieder schliessen. Am besten öffnet man Dateien wo es geht zusammen mit der ``with``-Anweisung.

Bei Textdateien sollte man beim öffnen immer explizit die Kodierung angeben.

Der Pfad zur INI-Datei sollte *einmal* erstellt werden und nicht mehrfach was Mehrarbeit bei Änderunegen mit sich zieht und fehleranfälliger ist.

`readlines()` braucht man selten bis nie. Man kann doch einfach über das Dateiobjekt iterieren ohne das man alles in eine Liste einlesen muss.

`Inhalt` sollte klein geschrieben sein und nicht als wäre es ein Klassenname. Einige von den Methodennamen sind auch falsch geschrieben, selbst wenn man neben den Python-Konventionen noch die Qt-Konventionen hinzu nimmt.

Falls "Laden=0" in der Datei steht, sollte das Kreuzchen explizit entfernt werden, oder anders gesagt sollte jede Einstellung zu einem setzen *oder* entfernen des Häkchens führen.

Dazu muss man die einzelnen Zeilen ordentlich parsen, also am "=" zerlegen und schauen was davor und danach steht, und aufgrund dessen entsprechend reagieren.

Noch besser wäre wenn man das nicht selbst macht, sondern ein Standardformat verwendet, wofür es schon Code zum lesen/schreiben gibt. Also bei INI-Dateien beispielsweise `configparser` aus der Standardbibliothek. Oder ein Format wie JSON wo es mehr Unterstützung für Datentypen gibt.

`exec_()` sollte man nicht mehr verwenden, das gibt es in PyQt6/PySide6 nicht mehr, weil in Python 3 ``exec`` kein Schlüsselwort mehr ist, und die Methode auch unter dem Namen `exec()` verwendbar ist.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Ernie1412
User
Beiträge: 160
Registriert: Freitag 10. Januar 2020, 20:38

ich bin kein Profi, das programm was ich schreibe ist allein für mich.
ich hab meine Infos nur durch probieren und internetsuche erhalten.

wie ich was schreibe, ob Variable gross oder klein ist achte ich daher nicht drauf.

ich hatte glaube ich in meinem der ersten Posts auch ein ähnliches Kommentar erhalten, nur nicht so ausführlich.

ich habe aber die Lösung schon selber gefunden. evtl mit einem bischen Hilfe deines Kommentars. Ein wenig hilfreich warste also doch :)
Dazu muss man die einzelnen Zeilen ordentlich parsen, also am "=" zerlegen und schauen was davor und danach steht, und aufgrund dessen entsprechend reagieren.
dadurch kam ich auf meine Lösung.

und ja JSON ist doch etwas komfortable, werde ich wohl umändern anstatt ini, insbesondere wenn mehrere Einstellungen dazukommen.
Antworten