Постоянно работающая функция не блокирующая интерфейс

Как сделать чтобы функция Power() работала на протяжении работы всей программы и чтобы не пропадал интерфейс?

main.py

from PyQt5 import QtWidgets, uic
from PyQt5.QtWidgets import (QWidget, QLCDNumber, QSlider,
 QVBoxLayout, QApplication)
import sys
import time
import design

class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
 def __init__(self):
     super().__init__()
     self.setupUi(self)
     self.pushButton.clicked.connect(self.Emergency_protection)
     self.verticalSlider.valueChanged[int].connect(self.Absorber)
     self.verticalSlider_2.valueChanged[int].connect(self.Turbine)
     self.power = 0
     self.value_absorder = 0

     
 def Emergency_protection(self):
     print("Запуск АЗ")

 def Absorber(self, value):
     self.value_absorder = value
     self.label_11.setText(str(value) + "%")
   

 
 def Turbine(self, value):
     self.value_turbine = value
     self.label_12.setText(str(value) + "%")

 def Power(self):
     print("eee")
     time.sleep(1)
     self.Power()
    # self.power+=1
   #  self.lcdNumber.display(str(self.power))

     
def main():
 app = QtWidgets.QApplication(sys.argv) 
 window = ExampleApp()
 window.Turbine(33)
 window.show()
 app.exec_()
 while True:
     clss = ExampleApp()
     clss.Power()

if __name__ == '__main__': 
 main()

design.py

from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(847, 563)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(10, 30, 101, 31))
        self.lcdNumber.setObjectName("lcdNumber")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 101, 21))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(160, 10, 241, 21))
        self.label_2.setObjectName("label_2")
        self.lcdNumber_3 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_3.setGeometry(QtCore.QRect(160, 30, 231, 31))
        self.lcdNumber_3.setObjectName("lcdNumber_3")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(440, 10, 181, 19))
        self.label_3.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
        self.label_3.setObjectName("label_3")
        self.lcdNumber_4 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_4.setGeometry(QtCore.QRect(440, 30, 171, 31))
        self.lcdNumber_4.setObjectName("lcdNumber_4")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(700, 10, 71, 19))
        self.label_4.setObjectName("label_4")
        self.lcdNumber_5 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_5.setGeometry(QtCore.QRect(700, 30, 64, 31))
        self.lcdNumber_5.setObjectName("lcdNumber_5")
        self.verticalSlider = QtWidgets.QSlider(self.centralwidget)
        self.verticalSlider.setGeometry(QtCore.QRect(60, 100, 40, 395))
        self.verticalSlider.setOrientation(QtCore.Qt.Vertical)
        self.verticalSlider.setObjectName("verticalSlider")
        self.verticalSlider_2 = QtWidgets.QSlider(self.centralwidget)
        self.verticalSlider_2.setGeometry(QtCore.QRect(150, 100, 40, 395))
        self.verticalSlider_2.setOrientation(QtCore.Qt.Vertical)
        self.verticalSlider_2.setObjectName("verticalSlider_2")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(70, 510, 16, 19))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(160, 510, 21, 19))
        self.label_6.setObjectName("label_6")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(360, 90, 441, 91))
        self.pushButton.setAutoFillBackground(True)
        self.pushButton.setAutoDefault(False)
        self.pushButton.setObjectName("pushButton")
        self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
        self.horizontalSlider.setGeometry(QtCore.QRect(360, 470, 451, 31))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(360, 440, 111, 19))
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(740, 500, 67, 19))
        self.label_8.setObjectName("label_8")
        self.lcdNumber_2 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_2.setGeometry(QtCore.QRect(410, 230, 111, 41))
        self.lcdNumber_2.setObjectName("lcdNumber_2")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(430, 200, 67, 19))
        self.label_9.setObjectName("label_9")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(660, 200, 67, 19))
        self.label_10.setObjectName("label_10")
        self.lcdNumber_6 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_6.setGeometry(QtCore.QRect(630, 230, 111, 41))
        self.lcdNumber_6.setObjectName("lcdNumber_6")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(360, 300, 201, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(590, 300, 211, 41))
        self.pushButton_3.setObjectName("pushButton_3")
        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(70, 80, 31, 19))
        self.label_11.setObjectName("label_11")
        self.label_12 = QtWidgets.QLabel(self.centralwidget)
        self.label_12.setGeometry(QtCore.QRect(160, 80, 31, 19))
        self.label_12.setObjectName("label_12")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мій РЕАКТОР"))
        self.label.setText(_translate("MainWindow", "ПОТУЖНІСТЬ"))
        self.label_2.setText(_translate("MainWindow", "ТЕМПЕРАТУРА АКТИВНОЇ ЗОНИ"))
        self.label_3.setText(_translate("MainWindow", "ТЕМПЕРАТУРА ТУРБІНИ"))
        self.label_4.setText(_translate("MainWindow", "РАДІАЦІЯ"))
        self.label_5.setText(_translate("MainWindow", "С"))
        self.label_6.setText(_translate("MainWindow", "Т"))
        self.pushButton.setText(_translate("MainWindow", "АВАРІЙНИЙ ЗАХИСТ"))
        self.label_7.setText(_translate("MainWindow", "СТАН ПАЛИВА"))
        self.label_8.setText(_translate("MainWindow", "100%"))
        self.label_9.setText(_translate("MainWindow", "МВт/год"))
        self.label_10.setText(_translate("MainWindow", "ГРОШІ"))
        self.pushButton_2.setText(_translate("MainWindow", "ЗАМІНА ПАЛИВА"))
        self.pushButton_3.setText(_translate("MainWindow", "РЕМОНТ ТУРБІНИ"))
        self.label_11.setText(_translate("MainWindow", "0 %"))
        self.label_12.setText(_translate("MainWindow", "0 %"))```

Ответы (1 шт):

Автор решения: S. Nick

Если ваша постоянно работающая функция не замораживает интерфейс, т.е. выполняемые в ней действия не занимают много времени, то вам достаточно QTimer, которые предоставляет повторяющиеся и однократные таймеры.

Иначе вам ее надо поместить в дополнительно созданный поток и оттуда посредством сигналов и слотов взаимодействовать с основным интерфейсом.

import sys
#import time
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


#import design
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setEnabled(True)
        MainWindow.resize(847, 563)
        MainWindow.setTabShape(QtWidgets.QTabWidget.Rounded)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber.setGeometry(QtCore.QRect(10, 30, 101, 31))
        self.lcdNumber.setObjectName("lcdNumber")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setGeometry(QtCore.QRect(10, 10, 101, 21))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setGeometry(QtCore.QRect(160, 10, 241, 21))
        self.label_2.setObjectName("label_2")
        self.lcdNumber_3 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_3.setGeometry(QtCore.QRect(160, 30, 231, 31))
        self.lcdNumber_3.setObjectName("lcdNumber_3")
        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setGeometry(QtCore.QRect(440, 10, 181, 19))
        self.label_3.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu)
        self.label_3.setObjectName("label_3")
        self.lcdNumber_4 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_4.setGeometry(QtCore.QRect(440, 30, 171, 31))
        self.lcdNumber_4.setObjectName("lcdNumber_4")
        self.label_4 = QtWidgets.QLabel(self.centralwidget)
        self.label_4.setGeometry(QtCore.QRect(700, 10, 71, 19))
        self.label_4.setObjectName("label_4")
        self.lcdNumber_5 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_5.setGeometry(QtCore.QRect(700, 30, 64, 31))
        self.lcdNumber_5.setObjectName("lcdNumber_5")
        self.verticalSlider = QtWidgets.QSlider(self.centralwidget)
        self.verticalSlider.setGeometry(QtCore.QRect(60, 100, 40, 395))
        self.verticalSlider.setOrientation(QtCore.Qt.Vertical)
        self.verticalSlider.setObjectName("verticalSlider")
        self.verticalSlider_2 = QtWidgets.QSlider(self.centralwidget)
        self.verticalSlider_2.setGeometry(QtCore.QRect(150, 100, 40, 395))
        self.verticalSlider_2.setOrientation(QtCore.Qt.Vertical)
        self.verticalSlider_2.setObjectName("verticalSlider_2")
        self.label_5 = QtWidgets.QLabel(self.centralwidget)
        self.label_5.setGeometry(QtCore.QRect(70, 510, 16, 19))
        self.label_5.setObjectName("label_5")
        self.label_6 = QtWidgets.QLabel(self.centralwidget)
        self.label_6.setGeometry(QtCore.QRect(160, 510, 21, 19))
        self.label_6.setObjectName("label_6")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(360, 90, 441, 91))
        self.pushButton.setAutoFillBackground(True)
        self.pushButton.setAutoDefault(False)
        self.pushButton.setObjectName("pushButton")
        self.horizontalSlider = QtWidgets.QSlider(self.centralwidget)
        self.horizontalSlider.setGeometry(QtCore.QRect(360, 470, 451, 31))
        self.horizontalSlider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontalSlider.setObjectName("horizontalSlider")
        self.label_7 = QtWidgets.QLabel(self.centralwidget)
        self.label_7.setGeometry(QtCore.QRect(360, 440, 111, 19))
        self.label_7.setObjectName("label_7")
        self.label_8 = QtWidgets.QLabel(self.centralwidget)
        self.label_8.setGeometry(QtCore.QRect(740, 500, 67, 19))
        self.label_8.setObjectName("label_8")
        self.lcdNumber_2 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_2.setGeometry(QtCore.QRect(410, 230, 111, 41))
        self.lcdNumber_2.setObjectName("lcdNumber_2")
        self.label_9 = QtWidgets.QLabel(self.centralwidget)
        self.label_9.setGeometry(QtCore.QRect(430, 200, 67, 19))
        self.label_9.setObjectName("label_9")
        self.label_10 = QtWidgets.QLabel(self.centralwidget)
        self.label_10.setGeometry(QtCore.QRect(660, 200, 67, 19))
        self.label_10.setObjectName("label_10")
        self.lcdNumber_6 = QtWidgets.QLCDNumber(self.centralwidget)
        self.lcdNumber_6.setGeometry(QtCore.QRect(630, 230, 111, 41))
        self.lcdNumber_6.setObjectName("lcdNumber_6")
        self.pushButton_2 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(360, 300, 201, 41))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setGeometry(QtCore.QRect(590, 300, 211, 41))
        self.pushButton_3.setObjectName("pushButton_3")
        self.label_11 = QtWidgets.QLabel(self.centralwidget)
        self.label_11.setGeometry(QtCore.QRect(70, 80, 31, 19))
        self.label_11.setObjectName("label_11")
        self.label_12 = QtWidgets.QLabel(self.centralwidget)
        self.label_12.setGeometry(QtCore.QRect(160, 80, 31, 19))
        self.label_12.setObjectName("label_12")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Мій РЕАКТОР"))
        self.label.setText(_translate("MainWindow", "ПОТУЖНІСТЬ"))
        self.label_2.setText(_translate("MainWindow", "ТЕМПЕРАТУРА АКТИВНОЇ ЗОНИ"))
        self.label_3.setText(_translate("MainWindow", "ТЕМПЕРАТУРА ТУРБІНИ"))
        self.label_4.setText(_translate("MainWindow", "РАДІАЦІЯ"))
        self.label_5.setText(_translate("MainWindow", "С"))
        self.label_6.setText(_translate("MainWindow", "Т"))
        self.pushButton.setText(_translate("MainWindow", "АВАРІЙНИЙ ЗАХИСТ"))
        self.label_7.setText(_translate("MainWindow", "СТАН ПАЛИВА"))
        self.label_8.setText(_translate("MainWindow", "100%"))
        self.label_9.setText(_translate("MainWindow", "МВт/год"))
        self.label_10.setText(_translate("MainWindow", "ГРОШІ"))
        self.pushButton_2.setText(_translate("MainWindow", "ЗАМІНА ПАЛИВА"))
        self.pushButton_3.setText(_translate("MainWindow", "РЕМОНТ ТУРБІНИ"))
        self.label_11.setText(_translate("MainWindow", "0 %"))
        self.label_12.setText(_translate("MainWindow", "0 %"))
        

#class ExampleApp(QtWidgets.QMainWindow, design.Ui_MainWindow):
class ExampleApp(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        
        self.pushButton.clicked.connect(self.emergency_protection)
        self.verticalSlider.valueChanged[int].connect(self.absorber)
        self.verticalSlider_2.valueChanged[int].connect(self.turbine)
        self.power = 0
        self.value_absorder = 0

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
        self.turbine(33)                                         # !!!
        self.date = QDate.currentDate() 
        font =  QFont('Arial', 16, QFont.Bold)
        self.statusBar().setFont(font)
        
        timer = QTimer(self)                                     # !!!
        timer.timeout.connect(self.funcPower)
        timer.start(1000)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        
     
    def emergency_protection(self):
        print("Запуск АЗ")

    def absorber(self, value):
        self.value_absorder = value
        self.label_11.setText(str(value) + "%")
 
    def turbine(self, value):
        self.value_turbine = value
        self.label_12.setText(str(value) + "%")

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv        
    def funcPower(self):
        current_time = QTime.currentTime()
        label_time = current_time.toString('hh:mm:ss')
        self.statusBar().showMessage('Time: ' + label_time + ' || Date: ' \
            + self.date.toString('dd.MM.yyyy'))
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        

     
if __name__ == '__main__': 
    app = QtWidgets.QApplication(sys.argv) 
    window = ExampleApp()
    window.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка