Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更新GUI上的标签值,该标签值始终从温度传感器获取更新值_Python_Pyqt5_Python Multithreading_Signals Slots_Slot - Fatal编程技术网

Python 更新GUI上的标签值,该标签值始终从温度传感器获取更新值

Python 更新GUI上的标签值,该标签值始终从温度传感器获取更新值,python,pyqt5,python-multithreading,signals-slots,slot,Python,Pyqt5,Python Multithreading,Signals Slots,Slot,我的项目是设计一个GUI窗口,从温度传感器获取温度,并将其显示在GUI上的标签小部件上。我能够显示该值,但它在标签上没有更新 请帮忙。我正在研究如何在pyqt5中发出信号并将其连接到标签小部件 from PyQt5 import QtCore, QtGui, QtWidgets from w1thermsensor import W1ThermSensor from PyQt5.QtCore import Qt, QThread, pyqtSignal, pyqtSlot sensor = (

我的项目是设计一个GUI窗口,从温度传感器获取温度,并将其显示在GUI上的标签小部件上。我能够显示该值,但它在标签上没有更新 请帮忙。我正在研究如何在pyqt5中发出信号并将其连接到标签小部件

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表单实例,没有
    pyqtSignal
    属性;同样,没有声明
    val
  • 使用pyuic生成的python文件不应被编辑,而应仅用作导入的模块,所有程序实现应在另一个类中进行,而不是在它创建的“ui”对象中进行(阅读更多信息)
如果您不再拥有GUI,请重新创建它,并使用pyuic再次生成ui。然后尝试在单独的文件中执行类似操作(假设您创建了一个名为
ui\u 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_())