Python 更新GUI上的标签值,该标签值始终从温度传感器获取更新值
我的项目是设计一个GUI窗口,从温度传感器获取温度,并将其显示在GUI上的标签小部件上。我能够显示该值,但它在标签上没有更新 请帮忙。我正在研究如何在pyqt5中发出信号并将其连接到标签小部件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 = (
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
- 连接在信号和插槽之间,但您正在尝试连接到
实例,该实例既不是信号也不是插槽,而是QThread对象李>threadclass
没有多大意义:self.threadclass.connect(pyqtSignal(val))
是在构造类时使用的函数,只能这样使用;另外,pyqtSignal
从不在val
signals()的范围内声明李>
也不起作用:self.pyqtSignal(val).connect(self.updateLabel)
是Ui表单实例,没有self
属性;同样,没有声明pyqtSignal
李>val
- 使用pyuic生成的python文件不应被编辑,而应仅用作导入的模块,所有程序实现应在另一个类中进行,而不是在它创建的“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_())