Seite 1 von 1
'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 00:22
von Knollo
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
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 00:37
von __blackjack__
@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
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 00:50
von Knollo
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.
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 10:39
von Knollo
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?
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 11:10
von grubenfox
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)
?
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 11:18
von Knollo

wäre schön, aber leider meckert VS-Code...
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 11:57
von sparrow
Was VS-Code da anzeigt ist ja egal.
Was passiert denn wenn du es ausführst?
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 12:01
von __blackjack__
@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?
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 12:57
von Knollo
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)
Re: 'false' zu False und 'true' zu True
Verfasst: Freitag 6. Dezember 2024, 17:22
von __blackjack__
@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.
Re: 'false' zu False und 'true' zu True
Verfasst: Sonntag 8. Dezember 2024, 13:52
von Knollo
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)
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.
Re: 'false' zu False und 'true' zu True
Verfasst: Sonntag 8. Dezember 2024, 14:27
von __blackjack__
@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()`.
Re: 'false' zu False und 'true' zu True
Verfasst: Sonntag 8. Dezember 2024, 15:21
von Knollo
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
Re: 'false' zu False und 'true' zu True
Verfasst: Sonntag 8. Dezember 2024, 16:31
von __blackjack__
@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.
Re: 'false' zu False und 'true' zu True
Verfasst: Sonntag 8. Dezember 2024, 18:43
von Knollo
mh, tatsächlich meckert Pylance nach der Verwendung von 'bool()' nicht weiter - danke.
