Постоянно работающая функция не блокирующая интерфейс
Как сделать чтобы функция 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_())
