обновление значения метки на GUI, которое постоянно получает обновленное значение от датчика температуры - PullRequest
0 голосов
/ 18 марта 2020

Мой проект заключается в разработке окна 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_())

1 Ответ

1 голос
/ 18 марта 2020

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

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

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