обновление значения метки в графическом интерфейсе, который постоянно получает обновленное значение от датчика температуры

мой проект заключается в разработке окна графического интерфейса пользователя для получения температуры от датчика температуры и отображения ее на виджете метки в графическом интерфейсе. я смог отобразить значение, но оно не обновляется на этикетке, пожалуйста, помогите. я искал, как излучать сигнал в 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_())

person abd younis    schedule 17.03.2020    source источник


Ответы (1)


Существуют различные проблемы с вашим кодом:

  • вы звоните 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 не объявлено;
  • файлы python, созданные с помощью pyuic, никогда не должны редактироваться, а должны использоваться только как импортированные модули, и вся реализация программы должна происходить в другом классе, а не в объектах "ui", которые он создает (подробнее о с помощью Designer);

Воссоздайте графический интерфейс, если у вас его больше нет, и снова создайте пользовательский интерфейс с помощью pyuic. Затем попробуйте сделать что-то вроде этого (предположим, вы создали файл с именем 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_())
person musicamante    schedule 17.03.2020