Visual Python ???

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.
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

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_())
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Zuletzt geändert von sparrow am Freitag 5. Februar 2021, 10:39, insgesamt 1-mal geändert.
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Ich habe keine Ahnung von QT, aber mir ist nicht klar wie denn der Else Zweig jemals aufgerufen werden soll.

EDIT: Zu langsam.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

wenn ich wüsste wie man hier bilder uploaden kann die NICHT von einer URL kommen,
könnte ich es besser erklären
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wo liegt das Problem einen Bildhoster wie imgur zu verwenden, wie jeder andere, der hier Bilder hochlaedt?
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

Bild
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Zuletzt geändert von sparrow am Freitag 5. Februar 2021, 11:26, insgesamt 2-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

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
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@sparrow: `clicked()` wird auch ausgelöst wenn man das mit der Tastatur bedient. Sonst wäre das Signal ziemlich wertlos.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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_())
andy_H
User
Beiträge: 12
Registriert: Samstag 23. Januar 2021, 15:06

@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
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten