Seite 2 von 2
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 10:25
von andy_H
hallo gemeinde und danke für eure tipps.
ich bin jetzt bei folgender kombination gelandet:
Qt-designer - Python 3.9.1 mit PyQt5 - Spyder IDE und prompt grandios gescheitert

mein dialog fenster besteht nur aus 2 elementen - 1 checkBox und einem label.
die checkbox wenn geclicked ändert den label text von "aus" in "an" - das geht auch,
aber eben nur einmal
und bleibt dann so.
rein logisch müsste das script aber so funktionieren oder ich habe python nicht verstanden
es geht auch mit toggled(bool) anstatt clicked nicht.
auch ein w.label.setText("AUS") nach und ausserhalb der if schleife bringt nix.
wo ist der fehler ?
Code: Alles auswählen
import sys
import PyQt5.QtCore as core
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as gui
import PyQt5.uic as uic
app = widgets.QApplication(sys.argv)
w = uic.loadUi("dialog.ui")
def check():
if w.checkBox.clicked:
w.label.setText("AN")
else:
w.label.setText("AUS")
w.checkBox.clicked.connect(check)
w.show()
sys.exit(app.exec_())
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 10:32
von sparrow
@andy_H: Was möchtest du denn erreichen? Das Signal wird ausgelöst, wenn du "clickst" und dann prüfst du im in check ob die checkbox gerade an_geklickt_ wird. Ja, sonst wärst du doch nicht in der Funktion. Guck doch mal, ob man nicht herausfindet, ob sie ge_checkt_ ist - ist ja eine CheckBox.
Edit: Oh, und ich sehe gerade: Lass dir mal anzeigen, welchen Wert du da denkst in der Abfrage zu vergleichen. clicked ist da ja eh falsch, aber vor allem ist clicked eine Funktion - die muss man auch aufrufen.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 10:37
von darktrym
Ich habe keine Ahnung von QT, aber mir ist nicht klar wie denn der Else Zweig jemals aufgerufen werden soll.
EDIT: Zu langsam.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 10:38
von andy_H
hi sparrow,
leider gibt es kein 'isclicked' oder "notclicked"
es gibt ein 'toggled(bool)' aber das hat genau den gleichen effekt - 1x wird der label text geändert und bleibt dann so
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 10:42
von sparrow
@andy_h: Bitte zeig deinen Code, denn dein Versuch oben zeigt, dass du möglicherweise nicht erkennst, dass es sich um eine Funktion handelt - und dann muss man die auch aufrufen.
Die
Qt Dokumentation zeigt, dass es eine Funktion namens checkState() gibt - oder (wenn man den Text liest) isChecked() wenn einem ein boolscher Wert reicht.
"click" ist etwas anderes als "check". Ich klicke einen Button an. Oder in ein Textfeld. Deshalb macht es keinen Sinn darauf zu prüfen. Es heißt CheckBox, weil sie in denglisch entweder "gecheckt" oder eben nicht.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:03
von andy_H
wenn ich wüsste wie man hier bilder uploaden kann die NICHT von einer URL kommen,
könnte ich es besser erklären
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:09
von __deets__
Wo liegt das Problem einen Bildhoster wie imgur zu verwenden, wie jeder andere, der hier Bilder hochlaedt?
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:20
von andy_H
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:23
von sparrow
@andy_H: Um das noch einmal zu verdeutlichen, was an deinem gezeigten Code grundsätzlich falsch ist:
Code: Alles auswählen
>>> def is_something():
return True
>>> print(is_something())
True
>>> print(is_something)
<function is_something at 0x0000018790DF4940>
>>> is_something() == True
True
>>> is_something == True
False
Eine Funktion muss aufgerufen werden. Dafür sind die Klammern da - auch wenn du keine Parameter hast. Wenn du die Klammern weg lässt, dann bindest du die Funktion an den Namen, nicht das Ergebnis ihres Aufrufs.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:29
von sparrow
Das, was dein Bild zeigt, sind Signale. Grob gesagt in Qt sind das Ereignisse, auf die du reagieren kannst.
Das hat aber nichts mit den Eigenschaften (und ob eine CheckBox gecheckt ist oder nicht, ist eine Eigenschaft) zu tun, die ein Element hat. Welche Eigenschaften ein Element hat, steht in der Dokumentation - und die habe ich dir oben verlinkt. Und dir gesagt, welche Funktionen du benutzen musst.
Sag doch mal konkret, was du nicht verstehst.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:45
von andy_H
erstmal danke für eure geduld
also: ich habe mich an einem YT tutorial von Jörn Loviscach orientiert.
Dort wird es so beschrieben/gemacht:
Ein mit qt-designer erstellte GUI enthält elemente die jeweils verschiedene events (siehe bild) auslösen können.
Diese events werden benutzt um in PyQt unterschiedliche aktionen auszuführen.
Das erschien mir logisch und sehr einfach!
> sind Signale. Grob gesagt in Qt sind das Ereignisse, auf die du reagieren kannst. <
und genau DAS möchte ich ja
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:51
von __blackjack__
@andy_H: Es gibt das Signal `clicked(bool)` das man verwenden könnte, das muss man aber explizit beim Verbinden auswählen, denn das Default-`clicked()`-Signal überträgt keinen Wert. Dann gibt es das `toggled()`-Signal. Und das `stateChanged()`-Signal. Alle drei liefern den Zustand in der ein oder anderen Form. Und die unterscheiden sich teilweise darin unter welchen Bedingungen sie ausgelöst werden. Da sollte man also in der Dokumentation schauen wo die Unterschiede liegen und welches Verhalten man braucht. `clicked(bool)` wird beispielsweise nicht ausgelöst wenn der Zustand nicht durch klicken auf den Button geändert wird.
Das Problem in Deinem Code ist, dass Du im ``if`` das Signal-Objekt verwendest. Das ist *immer* ”wahr” und dafür weder geeignet noch vorgesehen. Wenn Du das Default-`clicked()`-Signal verwenden willst, Dir da also den Zustand nicht gleich als Argument mitliefern lässt, dann musst Du den Zustand vom `QCheckButton` abfragen.
Womit Du gar nicht erst anfangen solltest ist Namen wie `w` und die dann auch noch global definieren.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 11:52
von sparrow
@andy_h: Kannst du dir bitte mal die Dokumentation anschauen, die ich verlinkt habe? Du darfst dich da nicht vom Qt-Desginer lenken lassen.
Und wenn du das für die
CheckBox tust, dann findest du da ein Signal, das augelöst wird, wenn sich der Status der CheckBox ändert. Warum ist das das richtige Signal? Was machst du, wenn jemand dein Programm ohne Maus bedient - nur mit der Tastatur? Er springt mit TAB zu deiner CheckBox und drückt die Taste um sie zu aktivieren. Das "clicked" würde nie ausgelöst werden, denn es würde ja nie geklickt werden. Wenn du auf das Ändern reagieren möchtest, dann musst du auf das Signal stateChanged reagieren.
Und wenn du wissen möchtest ob eine Checkbox gerade angehakt ist oder nicht, dann entweder über die Funktion .checkState() (wenn es mehr als ja/nein gibt) oder .isChecked() (wenn nur ja/nein) möglich ist.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 12:04
von __blackjack__
@sparrow: `clicked()` wird auch ausgelöst wenn man das mit der Tastatur bedient. Sonst wäre das Signal ziemlich wertlos.
Re: Visual Python ???
Verfasst: Freitag 5. Februar 2021, 12:08
von sparrow
Hmm... ja, das stimmt. Da war ich etwas schnell mit dem Beispiel.
Aber .stateChanged wird auch ausgelöst, wenn der Status durch das Programm geändert wird. Zumindest weiß ich, dass ich einmal darüber gestolpert bin und deshalb lieber 2 Mal auf die Signale schaue.
Re: Visual Python ???
Verfasst: Samstag 6. Februar 2021, 15:43
von andy_H
so, geschafft ...
ihr profis werdet zwar die hände über dem kopf zusammenschlagen, aber es funktioniert so wie ich es brauche.
ich habe einfach 2 radiobuttons genommen äh missbraucht.
so ist das für mich total logisch und simpel.
Ohne klasse, ohne init, ohne (self.irgendwas)
Code: Alles auswählen
def check1():
w.labelT.setText("AN")
def check2():
w.labelT.setText("AUS")
w.radioButtonAN.clicked.connect(check1)
w.radioButtonAUS.clicked.connect(check2)
im übrigen dient das nur zur kontrolle ob eine aktion überhaupt ausgeführt wird.
sieht irgendwie doof aus, ist mir aber egal da es lediglich dazu dienen soll später die GPIO pins anzusprechen (GPIOzero)
greetz andy
Re: Visual Python ???
Verfasst: Samstag 6. Februar 2021, 20:58
von sparrow
Wenn es funktioniert ist ja gut - aber warum hast du nicht den ursprünglichen Plan weiter verfolgt?
Ungetestet:
Code: Alles auswählen
import sys
import PyQt5.QtCore as core
import PyQt5.QtWidgets as widgets
import PyQt5.QtGui as gui
import PyQt5.uic as uic
app = widgets.QApplication(sys.argv)
w = uic.loadUi("dialog.ui")
def stateChanged(new_state):
# new_state = 0 is not checked, 1 is partial checked, 2 is checked
if new_state == 0:
w.label.setText("AUS")
elif new_state == 2:
w.label.setText("AN")
w.checkBox.stateChanged.connect(stateChanged)
w.show()
sys.exit(app.exec_())
Re: Visual Python ???
Verfasst: Sonntag 7. Februar 2021, 08:45
von andy_H
@sparrow
den ursprünglichen plan habe ich nicht weiterverfolgt weil ich a)mit der docu nichts anfangen konnte und b)ich deine tips z.b.
> Das hat aber nichts mit den Eigenschaften (und ob eine CheckBox gecheckt ist oder nicht, ist eine Eigenschaft) zu tun, die ein Element hat. Welche Eigenschaften ein Element hat, steht in der Dokumentation - und die habe ich dir oben verlinkt. Und dir gesagt, welche Funktionen du benutzen musst.< echt nicht verstanden habe/zu abstrakt war..
Jetzt wo ich deinen code lese (der übrigens sauber funktioniert), vielen dank dafür!!!, ist es mir vollkommen klar was gemeint war. SO! ist es für mich nachvollziehbar und logisch, dazu noch sehr einfach.
merci andy
Re: Visual Python ???
Verfasst: Sonntag 7. Februar 2021, 12:51
von __blackjack__
Wobei ich da nicht diese magischen Zahlen verwenden würde sondern die dafür vorgesehenen Konstanten: `core.Qt.Unchecked` und `core.Qt.Checked`, damit man als leser weniger rätseln muss.