使用PyQt和Raspberry显示实时数据

问题描述 投票:0回答:1

我目前正在使用Raspberry Pi 3从温度和湿度传感器(DHT11)收集数据,然后使用PyQt4在QTextEdit中显示它。问题是我想实时执行此操作,但是无法自动将数据更新到界面中。有谁知道我该怎么做?

PS:如果您有兴趣,这是install Adafruit的链接。

祝您有美好的一天,

import time
import Adafruit_DHT
from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class Ui_Room1(object):

    def AffichT(self):  
        sensor=11
        pin=4
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        if temperature is not None:
            print('Temp={0:0.1f}*  Humidity={1:0.1f}%'.format(temperature, humidity))
            return str(temperature)
        else:
            print('Failed to get reading. Try again!')
            sys.exit(1)

    def AffichH(self):            
        sensor=11
        pin=4
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        if humidity is not None:
            return str(humidity)
        else:
            print('Failed to get reading. Try again!')
            sys.exit(1)

    def setupUi(self, Room1):

        Room1.setObjectName(_fromUtf8("Room1"))
        Room1.resize(674, 422)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Room1.sizePolicy().hasHeightForWidth())
        Room1.setSizePolicy(sizePolicy)
        Room1.setMouseTracking(False)
        Room1.setStyleSheet(_fromUtf8("image: url(:/gradient1/Images/gradient1.png);\n"
"\n"
""))
        self.centralwidget = QtGui.QWidget(Room1)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
       self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.graphicsView = QtGui.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(610, 30, 41, 41))
        self.graphicsView.setStyleSheet(_fromUtf8("background-color: transparent;\n"
"background-image: url(:/gradient1/Images/logout.png);\n"
"background-repeat: no;"))
        self.graphicsView.setFrameShape(QtGui.QFrame.NoFrame)
        self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
        self.label = QtGui.QLabel(self.centralwidget)
       self.label.setGeometry(QtCore.QRect(270, 50, 131, 31))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setStyleSheet(_fromUtf8("image : none;\n"
"color: #fff;\n"
"background-color: transparent;"))
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(140, 170, 101, 61))
        self.label_2.setStyleSheet(_fromUtf8("image: none;\n"
"color: #fff;\n"
"background-color: #347;"))
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(140, 260, 101, 61))
        self.label_3.setStyleSheet(_fromUtf8("image: none;\n"
"color: #fff;\n"
"background-color: #347;"))
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.label_4 = QtGui.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(300, 170, 101, 61))
        self.label_4.setStyleSheet(_fromUtf8("image: none;\n"
"color: #fff;\n"
"background-color: #347;"))
        temp = self.AffichT()
        self.label_4.setText(_fromUtf8(temp+"°"))
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.label_5 = QtGui.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(300, 260, 101, 61))
        self.label_5.setStyleSheet(_fromUtf8("image: none;\n"
"color: #fff;\n"
"background-color: #347;"))
        hum = self.AffichH()
        self.label_5.setText(_fromUtf8(hum)+"%")
        self.label_5.setObjectName(_fromUtf8("label_5"))
        Room1.setCentralWidget(self.centralwidget)
        self.retranslateUi(Room1)
        QtCore.QMetaObject.connectSlotsByName(Room1)


    def retranslateUi(self, Room1):
        Room1.setWindowTitle(_translate("Room1", "Parents Room", None))
        self.label.setText(_translate("Room1", "Welcome !", None))
        self.label_2.setText(_translate("Room1", "Température:", None))
        self.label_3.setText(_translate("Room1", "Humidité:", None))


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    Room1 = QtGui.QMainWindow()
    ui = Ui_Room1()
    ui.setupUi(Room1)
    Room1.show()
    sys.exit(app.exec_())`
python-3.x pyqt4 raspberry-pi3
1个回答
1
投票

必须考虑以下因素:

  • 读取温度传感器会花费一些时间,在DHT的情况下会消耗2秒钟,这不是普遍的缺点,因为环境温度不会快速变化。

  • 由于读取任务非常耗时,因此不应在主线程中执行,而应在辅助线程中执行并通过信号发送信息。

import time
import threading

import Adafruit_DHT
from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s


try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)


class Ui_Room1(object):
    def setupUi(self, Room1):
        Room1.setObjectName(_fromUtf8("Room1"))
        Room1.resize(674, 422)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(Room1.sizePolicy().hasHeightForWidth())
        Room1.setSizePolicy(sizePolicy)
        Room1.setMouseTracking(False)
        Room1.setStyleSheet(
            _fromUtf8("image: url(:/gradient1/Images/gradient1.png);\n" "\n" "")
        )
        self.centralwidget = QtGui.QWidget(Room1)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.centralwidget.sizePolicy().hasHeightForWidth()
        )
        self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.graphicsView = QtGui.QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QtCore.QRect(610, 30, 41, 41))
        self.graphicsView.setStyleSheet(
            _fromUtf8(
                "background-color: transparent;\n"
                "background-image: url(:/gradient1/Images/logout.png);\n"
                "background-repeat: no;"
            )
        )
        self.graphicsView.setFrameShape(QtGui.QFrame.NoFrame)
        self.graphicsView.setObjectName(_fromUtf8("graphicsView"))
        self.label = QtGui.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(270, 50, 131, 31))
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        font = QtGui.QFont()
        font.setPointSize(18)
        font.setBold(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setStyleSheet(
            _fromUtf8(
                "image : none;\n" "color: #fff;\n" "background-color: transparent;"
            )
        )
        self.label.setObjectName(_fromUtf8("label"))
        self.label_2 = QtGui.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(140, 170, 101, 61))
        self.label_2.setStyleSheet(
            _fromUtf8("image: none;\n" "color: #fff;\n" "background-color: #347;")
        )
        self.label_2.setObjectName(_fromUtf8("label_2"))
        self.label_3 = QtGui.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(140, 260, 101, 61))
        self.label_3.setStyleSheet(
            _fromUtf8("image: none;\n" "color: #fff;\n" "background-color: #347;")
        )
        self.label_3.setObjectName(_fromUtf8("label_3"))
        self.label_4 = QtGui.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(300, 170, 101, 61))
        self.label_4.setStyleSheet(
            _fromUtf8("image: none;\n" "color: #fff;\n" "background-color: #347;")
        )
        self.label_4.setObjectName(_fromUtf8("label_4"))
        self.label_5 = QtGui.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(300, 260, 101, 61))
        self.label_5.setStyleSheet(
            _fromUtf8("image: none;\n" "color: #fff;\n" "background-color: #347;")
        )
        self.label_5.setObjectName(_fromUtf8("label_5"))
        Room1.setCentralWidget(self.centralwidget)
        self.retranslateUi(Room1)
        QtCore.QMetaObject.connectSlotsByName(Room1)

    def retranslateUi(self, Room1):
        Room1.setWindowTitle(_translate("Room1", "Parents Room", None))
        self.label.setText(_translate("Room1", "Welcome !", None))
        self.label_2.setText(_translate("Room1", "Température:", None))
        self.label_3.setText(_translate("Room1", "Humidité:", None))


class Adafruit_DHT_Worker(QtCore.QObject):
    valueChanged = QtCore.pyqtSignal(float, float)

    def start(self):
        threading.Thread(target=self._read, daemon=True).start()

    def _read(self):
        sensor=11
        pin=4
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        if humidity is not None and temperature is not None:
            self.valueChanged.emit(temperature, humidity)


class Room1(QtGui.QMainWindow, Ui_Room1):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)

        self.dht_worker = Adafruit_DHT_Worker()
        self.dht_worker.valueChanged.connect(self.on_value_changed)
        self.dht_worker.start()

    @QtCore.pyqtSlot(float, float)
    def on_value_changed(self, humidity, temperature):
        self.label_4.setNum(temperature)
        self.label_5.setNum(humidity)

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    w = Room1()
    w.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.