'false' zu False und 'true' zu True

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Hallo in die Runden, ich versuch grad Werte aus der Registry zu lesen und von String zu Bool umzuwandeln -> siehe Box:

Code: Alles auswählen

    def settings_read(self):
        # Einstellungen aus Registry importieren:
        settings = QSettings("Thingspeak_chart")
        state = settings.value('chkbox_esp_aussen') # gibt den String 'false' oder 'true' zurück
        state = bool(state) # gibt immer True zurück, egal ob 'true' oder 'false' aus der Registry gelesen wurde
        print(state)
        self.chkbox_esp_aussen.setChecked(state)
muss ich an der Stelle wirklich mit 'if else' arbeiten, oder gibt es andere Lösungen dafür?

Danke - Stefan
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Warum gibt das eine Zeichenkette zurück? Wenn man da Wahrheitswerte rein steckt, sollten da auch wieder Wahrheitswerte raus kommen, und keine Zeichenketten:

Code: Alles auswählen

In [348]: ss = QSettings()

In [349]: ss.setValue("is_something", True)

In [350]: ss.value("is_something")
Out[350]: True

In [351]: type(ss.value("is_something"))
Out[351]: bool
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Warum gibt das eine Zeichenkette zurück?
- ich hab keine Ahnung...
Wert setzen:

Code: Alles auswählen

settings.setValue('chkbox_esp_aussen', self.chkbox_esp_aussen.isChecked())
aber die Ausgabe erfolgt als String.

Code: Alles auswählen

self.chkbox_esp_aussen.setChecked(eval((settings.value("chkbox_esp_aussen").capitalize())))
passt , aber VS-Code meckert bei 'capitalize' mit gewellter Linie, führt trotzdem das Script korrekt aus.
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Hm, das Problem liegt vermutlich im Betriebssystem:

Linux schreibt: true oder false
Windows schreibt: 'true' oder 'false'

richtig wäre unter Windows: 1 oder 0
kann das so sein?
Benutzeravatar
grubenfox
User
Beiträge: 612
Registriert: Freitag 2. Dezember 2022, 15:49

Offenbar kann man da auch einen "Wunsch"-Typ mit angeben https://doc.qt.io/qtforpython-6/PySide6 ... ings.value

Was liefert denn

Code: Alles auswählen

state = settings.value('chkbox_esp_aussen', type=bool)
?
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Bild
wäre schön, aber leider meckert VS-Code...
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Was VS-Code da anzeigt ist ja egal.
Was passiert denn wenn du es ausführst?
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Was bekommst Du denn von `value()` zurück? Was für einen Typ hat das? Kann es sein, dass Du da keine Qt-Anbindung verwendest die selbst umwandelt und da tatsächlich der Typ zurück kommt den C++ da verwendet?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Was passiert denn wenn du es ausführst?

Code: Alles auswählen

TypeError: 'PySide6.QtWidgets.QAbstractButton.setChecked' called with wrong argument types:
  PySide6.QtWidgets.QAbstractButton.setChecked(str)
Supported signatures:
  PySide6.QtWidgets.QAbstractButton.setChecked(bool)
gibt String zurück, erwartet wird Bool

gelöst hab ich jetzt so:

Code: Alles auswählen

self.chkbox_esp_aussen.setChecked(False if settings.value("chkbox_esp_aussen") == 'false' else True)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Das sieht nach einem Bug aus. Oder es wird tatsächlich irgendwo eine Zeichenkette als Wert gesetzt. Ich hatte ja weiter oben ein minimales Beispiel gezeigt, wo ich einen Wahrheitswert rein stecke und auch wieder heraus hole, und keine Zeichenkette. So sollte das sein.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Ich hatte ja weiter oben ein minimales Beispiel gezeigt, wo ich einen Wahrheitswert rein stecke und auch wieder heraus hole, und keine Zeichenkette. So sollte das sein.
auf dem Raspi kann ich Dein Beispiel nachvollziehen, das passt es.
Unter Windows wird True oder False als String gespeichert. Man könnte es ja auch unter Win 10 testen, aber was bringt's....

Eine/ meine Lösung:

Code: Alles auswählen

 # schreibe in die Registry:
 settings.setValue('chkbox_esp_aussen', 0 if self.chkbox_esp_aussen.isChecked()== False else 1)
Bild

dann klappt auch das Lesen ohne if -> else

Code: Alles auswählen

self.chkbox_esp_aussen.setChecked(settings.value("chkbox_esp_aussen"))
ergo: in der Windowsregistry werden True und False als String gespeichert und Wahrheitswerte nur als 0 und 1 akzeptiert, wobei Python mit der Interpredation von 0 und 1 keine Probleme hat.
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Statt des ``0 if something == False else 1`` würde man einfach ``int(something)`` schreiben.

Code: Alles auswählen

In [436]: int(False)
Out[436]: 0

In [437]: int(True)
Out[437]: 1
Rückumwandlung geht mit `bool()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

Danke, hab ich nun so eingebaut - sieht auch übersichtlicher aus. Die Rückumwandlung mit 'bool()' ist nicht notwendig - Python inteprediert 1 und 0 als True und False.
Stefan
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Knollo: Weiss ich, aber wenn man dann mal Fehlersuche betreibt oder so etwas als JSON kodieren will oder so, ist es halt doch schöner `True` und `False` statt 1 und 0 zu verwenden/sehen.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Knollo
User
Beiträge: 63
Registriert: Mittwoch 10. Juni 2020, 14:44

mh, tatsächlich meckert Pylance nach der Verwendung von 'bool()' nicht weiter - danke. :)
Antworten