首页 > 解决方案 > 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_())

标签: pythonpyqt5python-multithreadingsignals-slotsslot

解决方案


您的代码存在各种问题:

  • 您正在调用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_())

推荐阅读