Textfeld Probleme: int umwandeln und Schleifenfehler

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Hallo
ihr habt mir mal sehr weiter geholfen, bei meinen ersten Schritten in Pyhthon und Qt.
Ich hätte 2 kurze fragen, wo ich einfach nicht schlau werde und ich auch im Internet keine Lösung gefunden habe. Es kam bei allen versuchen ein error :mrgreen: wo es hieß kann nicht umgewandelt werden.

Ich habe mir eine .ui gebastelt, in der ich in ein "Textfeld3" eine Zahl eingebe, diese im späteren verlauf dann benötigt wird. jedoch ist diese standart formatiert als string und ich bekomme es einfach nicht hin in int umzuwandeln. Desweiteren habe ich mir eine schleife gebastelt die die Temperaturen des Raspberrys nach einer Zeit im .ui Fenster ausgibt. jedoch macht diese es nur beim letzte druchlauf und nicht nach einer bestimmten wartezeit von XX Sekunden. (diese XX Sekunden würde ich gerne vom benutzer im Textfeld3 eingeben lassen jedoch habe ich das problem mit dem String => int)

Hier ein auschnitt des Codes:

Code: Alles auswählen

warte=self.ui.Textfeld3.text #muss irgendwie zu int werden
        for i in range(0,10):        
            #in .txt schreiben
            logfile.write("Temperatur: "+Tempwert+"°C  Zeitpunkt der Messung: "+timestamp+"\n")
            self.ui.Textfeld.setText("Temperatur: "+Tempwert+" \xb0C")
            time.sleep(warte)
wenn für warte=5 schreibe dann wird in meine .txt auch alle 5 sek ein werte geschrieben aber ich sehe in meiner .ui nur den letzten wert dann und nicht alle 5sekunden wenn die schleife druchlaufen wird. Ziel ist es die wartezeit durch das Textfeld3 individuell eingeben zu lassen.

hoffe ihr könnt mir hier weiterhelfen. Danke
BlackJack

@Ligurio: Um eine Zeichenkette mit Ziffern in eine ganze Zahl zu wandeln gibt es die `int()`-Funktion.

`Textfeld3` ist ein sauschlechter Name. Für (ganze) Zahlen gibt es übrigens auch spezielle Eingabewidgets.

In Funktionen und Methoden die von der GUI-Hauptschleife aufgerufen werden darf man nicht lange etwas tun, denn solange der eigene Code läuft kann die GUI nicht aktualisiert oder auf Benutzereingaben reagiert werden. Eine Schleife mit `time.sleep()` ist also gar keine gute Idee. Solche Schleifen muss man so schreiben das ein Schleifendurchlauf einem Funktions-/Methodenaufruf entspricht und das dann zum Beispiel von einem `QTimer` regelmässig durch ein Signal ausführen lassen.
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

das mit der int() Funktion habe ich schon versucht, aber irgendwie klappte das nicht so wie ich es will und kam trotzdem fehler.
in meinem qt designer habe ich kein eingabefeld gefunden das nur zahlen zulässt.

das Problem mit der schleife habe ich schon vermutet, dass die ausgabe geblockt wird. aber auch das netz hat mir keine erleuchtung gebracht wie ich den code schreiben sollte, damit die schleife nach jedem durchlauf eine ausgabe ins texfeld bringt.
ich habe schon einige stunden im netz gesucht und einiges ausprobiert. leider ohne erfolg.

Ich hoffe hier hat eventuell einer die Zeit mir eine kleine Code zeile zu tippen mit der es klappen könnte. :oops:
würde mich sehr freuen.
BlackJack

@Ligurio: Was soll man denn jetzt dazu sagen? `int()` tut bei mir was es soll. Wenn es das bei Dir nicht tut dann solltest Du vielleicht mal verraten *was* der Fehler ist den Du bekommst und *wobei* der genau kommt.

Code: Alles auswählen

In [26]: int('42')
Out[26]: 42

In [27]: int(u'42')
Out[27]: 42

In [28]: int(QtCore.QString('42'))
Out[28]: 42
Das Widget wäre eine `QSpinBox` und das gibt's bei mir auch im Qt-Designer.

Und zu der Schleife noch mal: Das geht nicht mit einer Schleife. Schreib das ganze so das das was in *einem* Schleifendurchlauf passieren soll in *einer* Methode steht und sorg dafür das die dann regelmässig über einen `QTimer` aufgerufen wird. Such nicht so viel irgendwo im Netz sondern nutze die Qt-Dokumentation. Die ist ziemlich gut, ausführlich, und hat auch viele Beispiele.
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Guten Morgen BlackJack

Ich weiß nicht was gestern loswar .... die Int Funktion hatte ich genauso angewendet und jetzt geht sie :K
bei der Spinbox klappts jetzt auch. Musste mir nur ausm netz den Befehl .value() zusammenreimen :D
Danke schonmal für diesen Grundlegenden wichtigen Hinweise. Natürlich habe ich das "Textfeld3" auch noch in einen richtigen schönen Namen umbenannt.

Habe mir in der Qt Dokumentation zum QTimer die infos durchgelesen. jedoch werde ich hier überhaupt nicht schlau wie ich meine Funktion "Temperaturmessung" durch den Qtimer (z.B alle 5sec) aufrufen lasse. Wie das funktioniert bzw meine alte nicht funktionierte ist mir nun klar jedoch bin ich echt zu blöd das in einen laufenden Code zu verwandeln.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Ligurio:
Und woran hakt es? Zeig doch mal den Code. Vom Prinzip her musst Du das,was Du innerhalb Deiner Schleife machen wolltest, in einen Slot packen, welchen Du an das timeout-Signal eines QTimer knüpfst.
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

Code: Alles auswählen

def on_button(self):
            self.ui.Statusfeld.setText("Erfolgreich geklickt")
            self.timer=QTimer()
            self.timer.setSingleShot(False)
            self.timer.start(5000) #5 sec
            self.timer.timeout.connect(self.Loggen)
also habe noch ein bissl geforscht und so nen code erstellt. (sorry wenn da zeilen drinne sind die nicht passen. dann bitte aufklären wozu diese sind und warum ich sie nicht brauche (z.B. set SingleShot(False))

mein Problem ist wie lasse ich diesen timer nun wiederholt starten solbald on_butten geklickt wurde.
leider klappt es nicht so einfach wenn ich eine for oder while schleife drum packe.
BlackJack

@Ligurio: Dein Problem ist kein Problem denn der sendet das Signal doch schon alle 5 Sekunden. `setSingleShot()` ist in der Tat unnötig weil `False` schon der voreingestellte Wert ist. (Hätte auch aus dem ersten Beispiel in der `QTimer`-Dokumentation ersichtlich sein sollen.)
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

ui Danke für den Hinweis BlackJack !!! da hast du recht hab ich übersehen !
gibt es einen "befehl" um den timer wieder zu stoppen? dafür hab ich irgendwie nichts gefunden bzw immer überlesen eventuell
BlackJack

@Ligurio: Ja so eine Methode gibt es und die heisst `stop()`.
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

self.timer.setSingleShot(True)

mit dem ding gehts auch :D auf einen 2. Knopf gelegt und der timer hört auf. oder bewirkt des was anderes
Aufjedenfall passiert des was ich will.
knopf1 => timer startet => befehl wird wiederholt ausgefürt
knopf2 => timer wird angehalten
Ligurio
User
Beiträge: 22
Registriert: Montag 23. November 2015, 11:00

danke nochmal für eure hilfestellungen. Programm läuft jetzt super verbraucht auch keine leistung am raspberry ;)

noch eine ganz kleine frage zum schluss. gibt es eine möglichkeit in einer Funktion eine andere funktion aufzurufen?
im moment kann ich das mit meinem wissen über python nur wenn sich etwas ändert z.B. .clicked.connect(self.Funktion2)

beispiel
def Funktion1:
-----"starte Funktion2"

mit dem QTimer würde es klappen. gibt es noch eine andere möglichkeit?
Antworten