首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pyqt5 -如何使用温度更新标签(ds18b20)

Pyqt5 -如何使用温度更新标签(ds18b20)
EN

Stack Overflow用户
提问于 2018-02-28 03:04:58
回答 1查看 1.1K关注 0票数 0

我正在尝试建立一个温度监视器使用pyqt5的树莓派3与ds18b20传感器连接。我是python和pyqt5的新手。

Gui文件(frameless.py)是用Qt4 designer开发的。Gui应该作为更环保的传感器(例如pH、EC等)的基本示例。待实现。实际代码(runframeless.py)如下所示。

我很清楚,如果要同时读取更多的senosor数据,最好使用线程(或多线程),但目前我遇到了一个非常简单的问题。

问题:温度显示在文本标签中,但def read_temp(自身)中的温度值没有更新。

问:谁能解释一下为什么不更新它,并帮助我正确地编写代码,以便当温度急剧变化时,gui中显示的温度值也会发生变化?

runframeless.py

代码语言:javascript
复制
# -*- coding: utf-8 -*-
# file: runframeless.py)
#-create a skeleton class(es) for Raspberry Pi GUI-

# need this
import sys
import time
import datetime
import os
import glob
#----This gets the Qt stuff------------------------
from PyQt5 import QtGui
from PyQt5 import QtCore
from PyQt5 import QtWidgets

from PyQt5.QtCore import Qt

from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtWidgets import QApplication
from PyQt5.QtWidgets import QLabel


# Import QtCreator/qtdesigner file
import frameless

os.system('modprobe w1-gpio')
os.system('modprobe w1-therm')

base_dir = '/sys/bus/w1/devices/'
device_folder = glob.glob(base_dir + '10*')[0]
device_file = device_folder + '/w1_slave'

#-------------------------------------------------
#----class(es) for our Raspberry Pi GUI-----------
#-------------------------------------------------

class MainWindow(QMainWindow, frameless.Ui_MainWindow): 
    def __init__(self):
        super(self.__class__, self).__init__()
        self.setupUi(self) # gets defined in the UI file

        self.label.setText(str(self.read_temp()))


        self.timer = QtCore.QTimer(self)
        self.timer.setInterval(1000)
        self.timer.timeout.connect(self.read_temp)
        self.timer.start()    

    def read_temp(self):
        f = open(device_file, 'r')
        lines = f.readlines()
        f.close()
        time.sleep(.1)
        while lines[0].strip()[-3:] != 'YES':
            time.sleep(.1)
            #lines = self.read_temp()
        equals_pos = lines[1].find('t=')
        if equals_pos != -1:
            temp_string = lines[1][equals_pos+2:]
            temp_c = float(temp_string) / 1000.0
            return temp_c


if __name__ == "__main__": 
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()

    sys.exit(app.exec_())

文件: frameless.py

代码语言:javascript
复制
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'frameless.ui'
#
# Created: Tue Feb 27 17:31:49 2018
#      by: PyQt5 UI code generator 5.3.2
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.setWindowFlags(Qt.FramelessWindowHint) # frameless
        MainWindow.resize(800, 480)
        MainWindow.setStyleSheet("background:rgb(0, 0, 0);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet("")
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(660, 430, 101, 31))
        self.pushButton.setStyleSheet("background: rgb(255, 255, 255) ")
        self.pushButton.setObjectName("pushButton")
        self.widget = QtWidgets.QWidget(self.centralwidget)
        self.widget.setGeometry(QtCore.QRect(10, 170, 751, 41))
        self.widget.setObjectName("widget")
        self.horizontalLayout = QtWidgets.QHBoxLayout(self.widget)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setStyleSheet("background: rgb(255, 255, 255) ")
        self.label_2.setObjectName("label_2")
        self.horizontalLayout.addWidget(self.label_2)
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setStyleSheet("background: rgb(255, 255, 255) ")
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        self.pushButton.clicked.connect(MainWindow.close)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "exit"))
        self.label_2.setText(_translate("MainWindow", "Ds18B20-sensor"))
        self.label.setText(_translate("MainWindow", "TextLabel"))


if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-28 07:45:28

在调试代码时,在逻辑上逐步了解程序的工作方式是值得的。

首先,像在__init__方法中一样,这行self.label.setText(str(self.read_temp()))只运行一次。这将调用self.read_temp()方法,该方法返回温度并将其放入文本框中。

接下来,在每秒调用self.read_temp()__init__方法中创建一个QTimer。因此,当计时器每秒钟触发一次时,self.read_temp就会运行,温度就会被读出,并返回给QTimer用来调用方法的任何内部代码。

此时,QTimer丢弃返回值,因为它不需要返回值,不能使用返回值,等等。

正如您现在可能看到的,它不更新的原因是因为您从未告诉它要更新。

我建议在return temp_c行之前添加self.label.setText(str(temp_c))行,以便从每秒运行的代码更新标签。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49016166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档