Pyqt5 - 如何用温度更新标签(ds18b20)
Pyqt5 - how to update label with temperature (ds18b20)
我正在尝试在连接了 ds18b20 传感器的 raspberry pi 3 上使用 pyqt5 构建一个温度监视器。我是 python 和 pyqt5 的新手。
Gui文件(frameless.py)是用QT 4 designer开发的。 Gui 应作为实施更多环境传感器(例如 pH EC 等)的基本示例。实际代码(运行frameless.py)如下所示。
我很清楚,如果要同时读取更多传感器数据,最好使用线程(或多线程),但目前我遇到了一个非常简单的问题。
问题:
温度显示在文本标签中,但 def read_temp(self) 中的温度值未更新。
问题:
任何人都可以解释为什么它没有更新并帮助我获得正确的代码,以便在温度实际变化时 gui 中显示的温度值也会发生变化?
运行frameless.py
# -*- 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
# -*- 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_())
调试代码时,从逻辑上逐步了解程序的工作原理是值得的。
首先,这一行 self.label.setText(str(self.read_temp()))
运行 就像在 __init__
方法中一样。这将调用 self.read_temp()
方法,该方法 returns 温度并将其放置在文本框中。
接下来,您在 __init__
方法中创建一个 QTimer
,它每秒调用 self.read_temp()
。因此,当计时器每秒触发时,self.read_temp
是 运行,温度被读出,并且 returned 到 QTimer
用来调用您的方法的任何内部代码。
此时 QTimer
丢弃 return 值,因为它不需要它,不能使用它,等等。
正如您现在可能看到的,它不更新的原因是您从未告诉它更新。
我建议在 return temp_c
行之前添加行 self.label.setText(str(temp_c))
以便根据每秒 运行s 的代码更新标签。
我在 github 中创建了一个存储库,其中包含 python 中的代码和用于温度控制(监控)的 PyQt5 raspberry Pi 和 ds18b20 传感器
您可以按照 link 使用它
https://github.com/salarshekari/ds18b20-raspberry-pyqt5
喜欢请不要忘记star
我正在尝试在连接了 ds18b20 传感器的 raspberry pi 3 上使用 pyqt5 构建一个温度监视器。我是 python 和 pyqt5 的新手。
Gui文件(frameless.py)是用QT 4 designer开发的。 Gui 应作为实施更多环境传感器(例如 pH EC 等)的基本示例。实际代码(运行frameless.py)如下所示。
我很清楚,如果要同时读取更多传感器数据,最好使用线程(或多线程),但目前我遇到了一个非常简单的问题。
问题: 温度显示在文本标签中,但 def read_temp(self) 中的温度值未更新。
问题: 任何人都可以解释为什么它没有更新并帮助我获得正确的代码,以便在温度实际变化时 gui 中显示的温度值也会发生变化?
运行frameless.py
# -*- 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
# -*- 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_())
调试代码时,从逻辑上逐步了解程序的工作原理是值得的。
首先,这一行 self.label.setText(str(self.read_temp()))
运行 就像在 __init__
方法中一样。这将调用 self.read_temp()
方法,该方法 returns 温度并将其放置在文本框中。
接下来,您在 __init__
方法中创建一个 QTimer
,它每秒调用 self.read_temp()
。因此,当计时器每秒触发时,self.read_temp
是 运行,温度被读出,并且 returned 到 QTimer
用来调用您的方法的任何内部代码。
此时 QTimer
丢弃 return 值,因为它不需要它,不能使用它,等等。
正如您现在可能看到的,它不更新的原因是您从未告诉它更新。
我建议在 return temp_c
行之前添加行 self.label.setText(str(temp_c))
以便根据每秒 运行s 的代码更新标签。
我在 github 中创建了一个存储库,其中包含 python 中的代码和用于温度控制(监控)的 PyQt5 raspberry Pi 和 ds18b20 传感器 您可以按照 link 使用它 https://github.com/salarshekari/ds18b20-raspberry-pyqt5 喜欢请不要忘记star