python - updating a label value on the GUI which gets updated value from temperature sensor all the time
问题描述
my project is to design a GUI window to get Temperature from temp sensor and display it on a label widget on the GUI. i was able to display the value but it's not updating on the label please help. i was looking about how to emit signal in pyqt5 and connect it to the label widget
from PyQt5 import QtCore, QtGui, QtWidgets
from w1thermsensor import W1ThermSensor
from PyQt5.QtCore import Qt, QThread, pyqtSignal, pyqtSlot
sensor = (W1ThermSensor())
class Ui_Form(object):
def setupUi(self, parent=None):
Form.setObjectName("Form")
Form.resize(400, 300)
self.label = QtWidgets.QLabel(Form)
self.label.setGeometry(QtCore.QRect(60, 40, 141, 71))
self.label.setObjectName("label")
self.label.setNum(int(sensor.get_temperature()))
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
self.threadclass = ThreadClass()
self.threadclass.start()
self.signals(self)
def signals(self):
self.threadclass.connect(self.updateLabel)
self.threadclass.connect(pyqtSignal(val))
self.pyqtSignal(val).connect(self.updateLabel)
def updateLabel(self,val):
val = int(sensor.get_temperature())
self.label.setNum(val)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
class ThreadClass(QtCore.QThread):
change_value = pyqtSignal(int)
def setupUi(self, parent=None):
super(ThreadClass, self).__init__(parent)
def run(self):
while 1:
val = int(sensor.get_temperature())
self.change_value.emit(val)
print (val)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
ui.signals()
Form.show()
sys.exit(app.exec_())
解决方案
您的代码存在各种问题:
- 您正在调用
self.signals(self)
,但signals
不接受参数; - 连接是在信号和槽之间,但你试图连接到
threadclass
实例,它既不是信号也不是槽,而是一个 QThread 对象; self.threadclass.connect(pyqtSignal(val))
没有多大意义:pyqtSignal
是构造类时使用的函数,只能这样使用;此外,从未在;val
的范围内声明signals()
self.pyqtSignal(val).connect(self.updateLabel)
也不起作用:self
是 Ui_Form 实例,没有pyqtSignal
属性;再次val
声明 no;- 永远不要编辑使用 pyuic 生成的 python 文件,而只能用作导入的模块,并且所有程序实现都应该发生在另一个类中,而不是它创建的“ui”对象中(阅读有关使用 Designer的更多信息);
如果您不再拥有它,请重新创建 GUI,然后使用 pyuic 再次生成 ui。然后尝试在一个单独的文件中做这样的事情(假设你已经创建了一个名为 的文件ui_form.py
):
from PyQt5 import QtCore, QtWidgets
from ui_form import Ui_Form
class MyTest(QtWidgets.QWidget, Ui_Form):
def __init__(self, parent=None):
super(MyTest, self).__init__(parent)
self.setupUi(self)
self.threadclass = ThreadClass()
self.threadclass.change_value.connect(self.updateLabel)
self.threadclass.start()
def updateLabel(self, value):
self.label.setNum(value)
class ThreadClass(QtCore.QThread):
change_value = pyqtSignal(int)
def setupUi(self, parent=None):
super(ThreadClass, self).__init__(parent)
def run(self):
while 1:
val = int(sensor.get_temperature())
# I suppose
self.change_value.emit(val)
print (val)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
test = MyTest
test.show()
sys.exit(app.exec_())
推荐阅读
- python - 如何在 Python 处理中将变量设置为 = 宽度或高度?
- javascript - 尝试删除多于一行时的奇怪行为
- r - R删除特定字符后跟街道地址中的数字
- python - 如何根据重复的 id 填充 NaN?
- python - 尝试从 python tornado 服务器将内容呈现为 html 时出错
- image - 如何提取图像元数据 Dart/Flutter
- ssl-certificate - java api从同一个pem文件中读取证书和CRL
- maven - 为什么即使我已经在 pom.xml 中包含了依赖项,我也会收到 NoClassDefFoundError?
- angular - AWS Cognito - 直接联合身份提供商登录页面(没有 cognito 登录页面)
- c# - 在图表中绘制多个线系列的按钮