springendes LCD-Display

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Tom Brady
User
Beiträge: 9
Registriert: Freitag 4. Dezember 2015, 07:13

Hallo,
Ich habe ein LCD-Display (lcdCounter), auf dem ich die Zeit hochzählen möchte. Dazu habe ich 3 RadioButtons (radioButton_250 und radioButton_500) und einen Start u. Stop Button mit dem QtDesigner erstellt.
Mit den Radio-Buttons soll ausgewählt werden, wie schnell der Counter zählt, also 1000ms, 500ms, 250ms (oder 1Hz, 2Hz, 4Hz)
Hier der Code (die .ui kann auf Wunsch auch hochgeladen werden):

Code: Alles auswählen

import sys
from PyQt4.uic import loadUiType
from PyQt4 import QtGui, QtCore

Ui_MainWindow, QMainWindow = loadUiType('Main_Window.ui')

class Main(QtGui.QMainWindow, Ui_MainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        self.setupUi(self)
        self.timer = QtCore.QTimer(self)

        self.manuell_button_Start.clicked.connect(self.Start)
        self.manuell_button_Stop.clicked.connect(self.Stop)
        self.timer.timeout.connect(self.StartUpdate)

    def Start(self):
        global zeitschritt
        if self.radioButton_250.isChecked() == True:
            zeitschritt = 250
        elif self.radioButton_500.isChecked() == True:
            zeitschritt = 500
        else:
            zeitschritt = 1000
        self.timer.start(zeitschritt)

    def StartUpdate(self):
        if self.radioButton_250.isChecked() == True:
            tim = self.lcdCounter.value() + 0.25
        elif self.radioButton_500.isChecked() == True:
            tim = self.lcdCounter.value() + 0.5
        else:
            tim = self.lcdCounter.value() + 1.0
        disptime = round(tim, 4)
        self.lcdCounter.display(str(disptime))

    def Stop(self):
        self.timer.stop()

app = QtGui.QApplication(sys.argv)
main = Main()
if __name__ == '__main__':
    main.show()
    sys.exit(app.exec_())
Das Problem ist, dass das LCD-Display bei der Auswahl von 4Hz springt, wenn in der Anzeige z.B. 1,25 Sekunden steht.
Das Springen bei 2Hz (1,5 Sekunden) konnte ich verhindern, indem ich die Anzeige in einem String darstelle. Dies funktioniert bei 4Hz leider nicht mehr.

Kann man im QtDesigner einstellen, dass er immer 2 Kommastellen darstellt (also auch 1,00 Sekunden)?


Außerdem hätte ich gerne gewusst, wie man auf einem Label °C anzeigt

Code: Alles auswählen

temp = 20
self.label_Temperatur.setText('Die Temperatur ist: ' + str(temp) + ' °C')
Angezeigt wird dann aber ein A mit Dach (also 20 °C)
(# -*- coding: utf-8 -*- steht ganz oben drin)
Danke.
Zuletzt geändert von Anonymous am Donnerstag 1. September 2016, 10:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Tom Brady: benutze nie global, was bei zeitschritt irgendwie auch total unnötig ist. Wenn man während der Timer läuft, eine andere Auswahl trifft, stimmt die Anzeige nicht mehr. Besser man speichert beim Start die Schrittweite. Die Methoden-Namen sind etwas seltsam. Der Name sollte sagen, was die Methode macht, unter StartUpdate kann ich mir nichts vorstellen. Immer wenn man Zahlen darstellen will, sollte man das per String-Formatierung machen, bei 2 Nachkommastellen also per '{:.2f}'.format(tim). Wie hast Du entscheiden, dass Anweisungen unter das if-__name__ geschrieben werden oder davor? Am besten packst Du das alles in eine eigene Funktion, typischerweise main genannt:

Code: Alles auswählen

import sys
from PyQt4.uic import loadUi
from PyQt4 import QtGui, QtCore

class Main(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        loadUi('Main_Window.ui', self)
        self.timer = QtCore.QTimer(self)
        self.manuell_button_Start.clicked.connect(self.click_start)
        self.manuell_button_Stop.clicked.connect(self.click_stop)
        self.timer.timeout.connect(self.update_counter)
        self.step = 0

    def click_start(self):
        if self.radioButton_250.isChecked() == True:
            self.step = 250
        elif self.radioButton_500.isChecked() == True:
            self.step = 500
        else:
            self.step = 1000
        self.timer.start(self.step)

    def update_counter(self):
        tim = self.lcdCounter.value() + self.step * 0.001
        self.lcdCounter.display('{:.2f}'.format(tim))

    def click_stop(self):
        self.timer.stop()

def main():
    app = QtGui.QApplication(sys.argv)
    main = Main()
    main.show()
    sys.exit(app.exec_())    

if __name__ == '__main__':
    main()
Qt erwartet Unicode-Strings, also

Code: Alles auswählen

self.label_Temperatur.setText(u'Die Temperatur ist: {:.1f}°C'.format(temp))
Tom Brady
User
Beiträge: 9
Registriert: Freitag 4. Dezember 2015, 07:13

Hallo Sirius3,
vielen vielen Dank. Ich hab das jetzt so in mein Programm eingearbeitet und es funktioniert.
Ein tolles Forum habt ihr hier.
Danke nochmal für die viele Mühe, die du dir gemacht hast.
Grüße.
Antworten