Программа начинает тормозить после долгой прорисовки графика с помощью pyqtgraph
Имеется программа, которая прорисовывает динамически изменяющийся график, в зависимости от положения ползунков. В смысл и подробности графика не будем вдаваться, основная проблема в том, что после нескольких минут работы - график и программа в целом начинает тормозить, помимо этого идет сильный жор оперативной памяти.
Не понимаю в чем проблема, слышал, что библиотека pyqtgraph позволяет строить до миллиона динамически изменяющихся точек без лагов и тормозов. С другой стороны, в программе есть 3-и списка, которые так же динамически изменяются (увеличиваются, см. скрин). Эти списки в цикле программы "пережевываются" и выходит 4-ый список, который мы как раз строим на графике.
Возможно моя проблема из-за того, что списки постоянно растут и через какое-то время начинают занимать очень много памяти? В общем не понятно, хочется осознать в чем проблема и найти пути решения.
Первая страница кода
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(938, 514)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout_2.setObjectName("verticalLayout_2")
self.frame = QtWidgets.QFrame(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.frame.sizePolicy().hasHeightForWidth())
self.frame.setSizePolicy(sizePolicy)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.frame)
self.label.setEnabled(True)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
self.label.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(14)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label.setFont(font)
self.label.setContextMenuPolicy(QtCore.Qt.DefaultContextMenu)
self.label.setLayoutDirection(QtCore.Qt.RightToLeft)
self.label.setAutoFillBackground(False)
self.label.setTextFormat(QtCore.Qt.AutoText)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.lineEdit_6 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_6.setObjectName("lineEdit_6")
self.verticalLayout.addWidget(self.lineEdit_6)
self.lineEdit_4 = QtWidgets.QLineEdit(self.frame)
self.lineEdit_4.setObjectName("lineEdit_4")
self.verticalLayout.addWidget(self.lineEdit_4)
self.label_2 = QtWidgets.QLabel(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
self.label_2.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt")
font.setPointSize(12)
self.label_2.setFont(font)
self.label_2.setTextFormat(QtCore.Qt.PlainText)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.verticalLayout.addWidget(self.label_2)
self.comboBox = QtWidgets.QComboBox(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
self.comboBox.setFont(font)
self.comboBox.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
self.comboBox.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToMinimumContentsLengthWithIcon)
self.comboBox.setObjectName("comboBox")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.comboBox.addItem("")
self.verticalLayout.addWidget(self.comboBox)
self.pushButton = QtWidgets.QPushButton(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
self.pushButton.setSizePolicy(sizePolicy)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.verticalLayout.addWidget(self.pushButton)
self.verticalLayout_2.addWidget(self.frame)
MainWindow.setCentralWidget(self.centralwidget)
self.action123 = QtWidgets.QAction(MainWindow)
self.action123.setObjectName("action123")
self.retranslateUi(MainWindow)
self.pushButton.clicked.connect(self.lineEdit_6.clear)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label.setText(_translate("MainWindow", "ЛАБОРАТОРНАЯ РАБОТА №1"))
self.label_2.setText(_translate("MainWindow", "Выберите номер варианта по списку"))
self.comboBox.setItemText(0, _translate("MainWindow", "1"))
self.comboBox.setItemText(1, _translate("MainWindow", "2"))
self.comboBox.setItemText(2, _translate("MainWindow", "3"))
self.comboBox.setItemText(3, _translate("MainWindow", "4"))
self.comboBox.setItemText(4, _translate("MainWindow", "5"))
self.comboBox.setItemText(5, _translate("MainWindow", "6"))
self.comboBox.setItemText(6, _translate("MainWindow", "7"))
self.comboBox.setItemText(7, _translate("MainWindow", "8"))
self.comboBox.setItemText(8, _translate("MainWindow", "9"))
self.comboBox.setItemText(9, _translate("MainWindow", "10"))
self.comboBox.setItemText(10, _translate("MainWindow", "11"))
self.comboBox.setItemText(11, _translate("MainWindow", "12"))
self.comboBox.setItemText(12, _translate("MainWindow", "13"))
self.comboBox.setItemText(13, _translate("MainWindow", "14"))
self.comboBox.setItemText(14, _translate("MainWindow", "15"))
self.comboBox.setItemText(15, _translate("MainWindow", "16"))
self.comboBox.setItemText(16, _translate("MainWindow", "17"))
self.comboBox.setItemText(17, _translate("MainWindow", "18"))
self.comboBox.setItemText(18, _translate("MainWindow", "19"))
self.comboBox.setItemText(19, _translate("MainWindow", "20"))
self.comboBox.setItemText(20, _translate("MainWindow", "21"))
self.comboBox.setItemText(21, _translate("MainWindow", "22"))
self.comboBox.setItemText(22, _translate("MainWindow", "23"))
self.comboBox.setItemText(23, _translate("MainWindow", "24"))
self.comboBox.setItemText(24, _translate("MainWindow", "25"))
self.comboBox.setItemText(25, _translate("MainWindow", "26"))
self.comboBox.setItemText(26, _translate("MainWindow", "27"))
self.comboBox.setItemText(27, _translate("MainWindow", "28"))
self.comboBox.setItemText(28, _translate("MainWindow", "29"))
self.comboBox.setItemText(29, _translate("MainWindow", "30"))
self.comboBox.setItemText(30, _translate("MainWindow", "31"))
self.comboBox.setItemText(31, _translate("MainWindow", "32"))
self.comboBox.setItemText(32, _translate("MainWindow", "33"))
self.comboBox.setItemText(33, _translate("MainWindow", "34"))
self.comboBox.setItemText(34, _translate("MainWindow", "35"))
self.pushButton.setText(_translate("MainWindow", "Далее"))
self.action123.setText(_translate("MainWindow", "123"))
Вторая страница кода
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(968, 710)
self.horizontalLayout_6 = QtWidgets.QHBoxLayout(Form)
self.horizontalLayout_6.setObjectName("horizontalLayout_6")
self.frame = QtWidgets.QFrame(Form)
self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.verticalLayout = QtWidgets.QVBoxLayout(self.frame)
self.verticalLayout.setObjectName("verticalLayout")
self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
self.horizontalLayout_7.setObjectName("horizontalLayout_7")
self.label_4 = QtWidgets.QLabel(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
self.label_4.setFont(font)
self.label_4.setAlignment(QtCore.Qt.AlignCenter)
self.label_4.setObjectName("label_4")
self.horizontalLayout_7.addWidget(self.label_4)
self.verticalLayout.addLayout(self.horizontalLayout_7)
self.textEdit = QtWidgets.QTextEdit(self.frame)
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.label = QtWidgets.QLabel(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(12)
self.label.setFont(font)
self.label.setTextFormat(QtCore.Qt.AutoText)
self.label.setScaledContents(False)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setWordWrap(True)
self.label.setOpenExternalLinks(False)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
self.horizontalLayout_4.setObjectName("horizontalLayout_4")
self.label_2 = QtWidgets.QLabel(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(10)
self.label_2.setFont(font)
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setObjectName("label_2")
self.horizontalLayout_4.addWidget(self.label_2)
self.label_3 = QtWidgets.QLabel(self.frame)
font = QtGui.QFont()
font.setFamily("HouschkaRoundedAlt 9")
font.setPointSize(10)
self.label_3.setFont(font)
self.label_3.setAlignment(QtCore.Qt.AlignCenter)
self.label_3.setObjectName("label_3")
self.horizontalLayout_4.addWidget(self.label_3)
self.verticalLayout.addLayout(self.horizontalLayout_4)
self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.lcdNumber_4 = QtWidgets.QLCDNumber(self.frame)
self.lcdNumber_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.lcdNumber_4.setFrameShadow(QtWidgets.QFrame.Raised)
self.lcdNumber_4.setLineWidth(0)
self.lcdNumber_4.setMidLineWidth(1)
self.lcdNumber_4.setDigitCount(3)
self.lcdNumber_4.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.lcdNumber_4.setObjectName("lcdNumber_4")
self.horizontalLayout_2.addWidget(self.lcdNumber_4)
self.lcdNumber_3 = QtWidgets.QLCDNumber(self.frame)
self.lcdNumber_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.lcdNumber_3.setDigitCount(3)
self.lcdNumber_3.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.lcdNumber_3.setObjectName("lcdNumber_3")
self.horizontalLayout_2.addWidget(self.lcdNumber_3)
self.verticalLayout.addLayout(self.horizontalLayout_2)
self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
self.horizontalLayout_3.setObjectName("horizontalLayout_3")
self.lcdNumber_2 = QtWidgets.QLCDNumber(self.frame)
self.lcdNumber_2.setFrameShape(QtWidgets.QFrame.NoFrame)
self.lcdNumber_2.setDigitCount(3)
self.lcdNumber_2.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.lcdNumber_2.setObjectName("lcdNumber_2")
self.horizontalLayout_3.addWidget(self.lcdNumber_2)
self.lcdNumber = QtWidgets.QLCDNumber(self.frame)
font = QtGui.QFont()
font.setPointSize(8)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.lcdNumber.setFont(font)
self.lcdNumber.setAutoFillBackground(False)
self.lcdNumber.setFrameShape(QtWidgets.QFrame.NoFrame)
self.lcdNumber.setFrameShadow(QtWidgets.QFrame.Raised)
self.lcdNumber.setSmallDecimalPoint(False)
self.lcdNumber.setDigitCount(3)
self.lcdNumber.setSegmentStyle(QtWidgets.QLCDNumber.Flat)
self.lcdNumber.setObjectName("lcdNumber")
self.horizontalLayout_3.addWidget(self.lcdNumber)
self.verticalLayout.addLayout(self.horizontalLayout_3)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalSlider_2 = QtWidgets.QSlider(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.verticalSlider_2.sizePolicy().hasHeightForWidth())
self.verticalSlider_2.setSizePolicy(sizePolicy)
self.verticalSlider_2.setMaximum(100)
self.verticalSlider_2.setOrientation(QtCore.Qt.Vertical)
self.verticalSlider_2.setObjectName("verticalSlider_2")
self.horizontalLayout.addWidget(self.verticalSlider_2)
self.verticalSlider = QtWidgets.QSlider(self.frame)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.verticalSlider.sizePolicy().hasHeightForWidth())
self.verticalSlider.setSizePolicy(sizePolicy)
self.verticalSlider.setFocusPolicy(QtCore.Qt.WheelFocus)
self.verticalSlider.setMaximum(100)
self.verticalSlider.setTracking(True)
self.verticalSlider.setOrientation(QtCore.Qt.Vertical)
self.verticalSlider.setInvertedAppearance(False)
self.verticalSlider.setInvertedControls(False)
self.verticalSlider.setTickPosition(QtWidgets.QSlider.NoTicks)
self.verticalSlider.setTickInterval(0)
self.verticalSlider.setObjectName("verticalSlider")
self.horizontalLayout.addWidget(self.verticalSlider)
self.verticalLayout.addLayout(self.horizontalLayout)
self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
self.horizontalLayout_5.setObjectName("horizontalLayout_5")
self.pushButton_2 = QtWidgets.QPushButton(self.frame)
self.pushButton_2.setObjectName("pushButton_2")
self.horizontalLayout_5.addWidget(self.pushButton_2)
self.pushButton = QtWidgets.QPushButton(self.frame)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout_5.addWidget(self.pushButton)
self.verticalLayout.addLayout(self.horizontalLayout_5)
self.horizontalLayout_6.addWidget(self.frame)
self.GraphWidget = PlotWidget(Form)
self.GraphWidget.setObjectName("GraphWidget")
self.horizontalLayout_6.addWidget(self.GraphWidget)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.label_4.setText(_translate("Form", "TextLabel"))
self.label.setText(_translate("Form", "Текущее значение степени открытия клапана, %"))
self.label_2.setText(_translate("Form", "Расход топлива"))
self.label_3.setText(_translate("Form", "Расход пит. воды"))
self.pushButton_2.setText(_translate("Form", "PushButton"))
self.pushButton.setText(_translate("Form", "PushButton"))
from pyqtgraph import PlotWidget
Основной код
from PyQt5 import QtWidgets, QtGui, QtCore
from first_try import Ui_MainWindow
from second_try import Ui_Form
import pyqtgraph as pg
from pyqtgraph import *
import sys
from control.matlab import *
import numpy as np
# Передаточная функция по каналу T-D (Температура - расход пит.воды)
num_D = [-1]
den_D = [10, 5, 1,]
delay_D = pade(3,10)
W_D= tf(num_D, den_D)*tf(delay_D[0],delay_D[1])
# Передаточная функция по каналу T-B (Температура - расход топлива)
num_B = [1]
den_B = [5, 2.5, 1]
delay_B = pade(5,10)
W_B= tf(num_B, den_B)*tf(delay_B[0],delay_B[1])
class Widget(QtWidgets.QWidget,Ui_Form):
def __init__(self,number,parent):
super(Widget, self).__init__(parent) # Позволяет использовать виджеты родителя
self.setupUi(self)
self.parent = parent
self.number = number
self.pushButton.setText('Внести возмущение')
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127); font: 12pt \"HouschkaRoundedAlt 9\";")
self.pushButton_2.setText('Внести возмущение')
self.pushButton_2.setStyleSheet("background-color: rgb(0, 255, 127); font: 12pt \"HouschkaRoundedAlt 9\";")
self.pushButton.clicked.connect(self.accept)
self.pushButton_2.clicked.connect(self.accept_2)
self.verticalSlider.setValue(60)
self.verticalSlider.valueChanged.connect(self.show_digit)
self.verticalSlider_2.setValue(60)
self.verticalSlider_2.valueChanged.connect(self.show_digit_2)
self.lcdNumber.display(self.verticalSlider_2.value())
self.lcdNumber_2.display(self.verticalSlider_2.value())
self.lcdNumber_3.display(self.verticalSlider.value())
self.lcdNumber_4.display(self.verticalSlider.value())
self.lcdNumber_3.setStyleSheet("background-color: rgb(0, 255, 127,25);")
self.lcdNumber_4.setStyleSheet("background-color: rgb(0, 255, 127,25);")
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.showTime)
self.timer.start(1000) # Частота обновления графика, мс
# Настройки графика
self.GraphWidget.setBackground((0, 255, 127,25))
self.pen_1 = pg.mkPen(color=(255, 0, 0), width=2)
self.pen_2 = pg.mkPen(color=(0, 255, 0), width=2)
self.pen_3 = pg.mkPen(color=(0, 0, 255), width=2)
styles = {'color': 'r', 'font-size': '15px'}
self.GraphWidget.setLabel('left', 'Температура (°C)', **styles)
self.GraphWidget.setLabel('bottom', 'Время (сек)', **styles)
self.name = 'Температура в точке 1'
self.GraphWidget.addLegend()
self.GraphWidget.showGrid(x=True, y=True)
self.t = np.array([]) # Время переходных процессов
self.U_B = np.array([]) # Входное возмужение в виде изменения расхода топлива
self.U_D = np.array([]) # Входное возмужение в виде изменения расхода пит.воды
self.T_nominal = 0.5
def accept(self):
self.lcdNumber_3.display(self.verticalSlider.value())
def accept_2(self):
self.lcdNumber_4.display(self.verticalSlider_2.value())
def show_digit(self):
self.lcdNumber.display(self.verticalSlider.value())
def show_digit_2(self):
self.lcdNumber_2.display(self.verticalSlider_2.value())
def showTime(self):
self.U_D = np.append(self.U_D,self.lcdNumber_3.value()/50)
self.U_B = np.append(self.U_B, self.lcdNumber_4.value()/50)
if len(self.t)==0:
self.t = np.append(self.t, 0)
else:
self.t = np.append(self.t, self.t[-1]+ 1)
if len(self.t) >= 2:
# Система имеет тип MISO: два входа - один выход.
self.Y = lsim(W_B, self.U_B, self.t)[0] + lsim(W_D, self.U_D, self.t)[0]
self.GraphWidget.plot(self.t[-2:],self.Y[-2:],pen=self.pen_1)
self.label_4.setText(str(round(self.Y[-1:][0],2))+' °C')
if self.Y[-1:] >= self.T_nominal:
alpha = round(abs(self.Y[-1:][0])*255/(5*self.T_nominal))
self.label_4.setStyleSheet("background-color: rgb(255, 0, 0,{});".format(alpha))
elif self.Y[-1:] <= self.T_nominal*0.5:
alpha = round(abs(self.Y[-1:][0]) * 255 / (4 * self.T_nominal))
self.label_4.setStyleSheet("background-color: rgb(0, 0, 255,{});".format(alpha))
else:
self.label_4.setStyleSheet("background-color: rgb(240, 240, 240);")
self.textEdit.setText(str(self.t))
self.textEdit.append(str(self.U_D))
self.textEdit.append(str(self.U_B))
class Start_Window(QtWidgets.QMainWindow,Ui_MainWindow):
def __init__(self):
super(Start_Window, self).__init__()
self.setupUi(self)
self.setWindowIcon(QtGui.QIcon('pythonlogo.png'))
self.lineEdit_6.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.lineEdit_6.setPlaceholderText('Введите группу: ТФ-ХХ-ХХ')
self.lineEdit_6.setMaxLength(9)
self.lineEdit_4.setPlaceholderText('Введите ФИО:')
self.lineEdit_4.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.comboBox.setStyleSheet("background-color: rgb(170, 170, 255);")
self.comboBox.hide()
self.label.hide()
self.label_2.hide()
self.lineEdit_4.hide()
self.lineEdit_6.hide()
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.clicked.connect(self.hide_widget)
def hide_widget(self):
self.frame.hide()
self.widget = (Widget(self.comboBox.currentText(),self))
self.verticalLayout_2.addWidget(self.widget)
app = QtWidgets.QApplication([])
application = Start_Window()
application.show()
app.setStyle('Fusion')
sys.exit(app.exec())
self.t, self.U_B, self.U_D - те 3-и входных списка и self.Y - выходной список, который отображаем на графике
Ответы (1 шт):
Первое что неправильно сделано:
self.textEdit.setText(str(self.t))
self.textEdit.append(str(self.U_D))
self.textEdit.append(str(self.U_B))
Замените так:
self.textEdit.moveCursor(QtGui.QTextCursor.Start)
self.textEdit.insertPlainText(f'{self.t[-1]:>20}{self.U_D[-1]:>25}{self.U_B[-1]:>25} '
f'{self.currentTime.currentTime().toString("hh:mm:ss:zzz"):>18}\n')
Обратите внимание, что я добавил для наблюдений
self.currentTime.currentTime().toString("hh:mm:ss:zzz"),
чтобы увидеть когда программа начинает тормозить.
Также предлагаю вам внимательно изучить пост https://stackoverflow.com/questions/58699630/accurate-timer-with-pyqt . Кроме всего прочего обратите внимание как обновляется график!
О результатах своих исследований дадите знать.
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
import pyqtgraph as pg
from pyqtgraph import *
from control.matlab import *
import numpy as np
from first_try import Ui_MainWindow
from second_try import Ui_Form
# Передаточная функция по каналу T-D (Температура - расход пит.воды)
num_D = [-1]
den_D = [10, 5, 1,]
delay_D = pade(3,10)
W_D = tf(num_D, den_D) * tf(delay_D[0], delay_D[1])
# Передаточная функция по каналу T-B (Температура - расход топлива)
num_B = [1]
den_B = [5, 2.5, 1]
delay_B = pade(5, 10)
W_B = tf(num_B, den_B) * tf(delay_B[0], delay_B[1])
class Widget(QtWidgets.QWidget, Ui_Form):
def __init__(self, number, parent):
super(Widget, self).__init__(parent) # Позволяет использовать виджеты родителя
self.setupUi(self)
self.parent = parent
self.number = number
self.pushButton.setText('Внести возмущение')
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127); font: 12pt \"HouschkaRoundedAlt 9\";")
self.pushButton_2.setText('Внести возмущение')
self.pushButton_2.setStyleSheet("background-color: rgb(0, 255, 127); font: 12pt \"HouschkaRoundedAlt 9\";")
self.pushButton.clicked.connect(self.accept)
self.pushButton_2.clicked.connect(self.accept_2)
self.verticalSlider.setValue(60)
self.verticalSlider.valueChanged.connect(self.show_digit)
self.verticalSlider_2.setValue(60)
self.verticalSlider_2.valueChanged.connect(self.show_digit_2)
self.lcdNumber.display(self.verticalSlider_2.value())
self.lcdNumber_2.display(self.verticalSlider_2.value())
self.lcdNumber_3.display(self.verticalSlider.value())
self.lcdNumber_4.display(self.verticalSlider.value())
self.lcdNumber_3.setStyleSheet("background-color: rgb(0, 255, 127,25);")
self.lcdNumber_4.setStyleSheet("background-color: rgb(0, 255, 127,25);")
self.timer = QtCore.QTimer()
self.timer.timeout.connect(self.showTime)
self.timer.start(1000) # Частота обновления графика, мс
# Настройки графика
self.GraphWidget.setBackground((0, 255, 127,25))
self.pen_1 = pg.mkPen(color=(255, 0, 0), width=2)
self.pen_2 = pg.mkPen(color=(0, 255, 0), width=2)
self.pen_3 = pg.mkPen(color=(0, 0, 255), width=2)
styles = {'color': 'r', 'font-size': '15px'}
self.GraphWidget.setLabel('left', 'Температура (°C)', **styles)
self.GraphWidget.setLabel('bottom', 'Время (сек)', **styles)
self.name = 'Температура в точке 1'
self.GraphWidget.addLegend()
self.GraphWidget.showGrid(x=True, y=True)
self.t = np.array([]) # Время переходных процессов
self.U_B = np.array([]) # Входное возмужение в виде изменения расхода топлива
self.U_D = np.array([]) # Входное возмужение в виде изменения расхода пит.воды
self.T_nominal = 0.5
# +++
self.textEdit.setReadOnly(1) # +++
self.currentTime = QtCore.QTime() # +++ для отладки
# +++
def accept(self):
self.lcdNumber_3.display(self.verticalSlider.value())
def accept_2(self):
self.lcdNumber_4.display(self.verticalSlider_2.value())
def show_digit(self):
self.lcdNumber.display(self.verticalSlider.value())
def show_digit_2(self):
self.lcdNumber_2.display(self.verticalSlider_2.value())
def showTime(self):
self.U_D = np.append(self.U_D, self.lcdNumber_3.value()/50)
self.U_B = np.append(self.U_B, self.lcdNumber_4.value()/50)
if len(self.t) == 0:
self.t = np.append(self.t, 0)
else:
self.t = np.append(self.t, self.t[-1]+ 1)
if len(self.t) >= 2:
# Система имеет тип MISO: два входа - один выход.
self.Y = lsim(W_B, self.U_B, self.t)[0] + lsim(W_D, self.U_D, self.t)[0]
self.GraphWidget.plot(self.t[-2:], self.Y[-2:], pen=self.pen_1) # ???
self.label_4.setText(str(round(self.Y[-1:][0],2))+' °C')
if self.Y[-1:] >= self.T_nominal:
alpha = round(abs(self.Y[-1:][0])*255/(5*self.T_nominal))
self.label_4.setStyleSheet("background-color: rgb(255, 0, 0,{});".format(alpha))
elif self.Y[-1:] <= self.T_nominal*0.5:
alpha = round(abs(self.Y[-1:][0]) * 255 / (4 * self.T_nominal))
self.label_4.setStyleSheet("background-color: rgb(0, 0, 255,{});".format(alpha))
else:
self.label_4.setStyleSheet("background-color: rgb(240, 240, 240);")
# - self.textEdit.setText(str(self.t))
# - self.textEdit.append(str(self.U_D))
# - self.textEdit.append(str(self.U_B))
# +++
self.textEdit.moveCursor(QtGui.QTextCursor.Start)
self.textEdit.insertPlainText(f'{self.t[-1]:>20}{self.U_D[-1]:>25}{self.U_B[-1]:>25} '
f'{self.currentTime.currentTime().toString("hh:mm:ss:zzz"):>18}\n')
# +++
class Start_Window(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super(Start_Window, self).__init__()
self.setupUi(self)
self.setWindowIcon(QtGui.QIcon('im.png'))
self.lineEdit_6.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.lineEdit_6.setPlaceholderText('Введите группу: ТФ-ХХ-ХХ')
self.lineEdit_6.setMaxLength(9)
self.lineEdit_4.setPlaceholderText('Введите ФИО:')
self.lineEdit_4.setStyleSheet("font: 12pt \"HouschkaRoundedAlt 9\";")
self.comboBox.setStyleSheet("background-color: rgb(170, 170, 255);")
self.comboBox.hide()
self.label.hide()
self.label_2.hide()
self.lineEdit_4.hide()
self.lineEdit_6.hide()
self.pushButton.setStyleSheet("background-color: rgb(0, 255, 127);")
self.pushButton.clicked.connect(self.hide_widget)
def hide_widget(self):
self.frame.hide()
self.widget = Widget(self.comboBox.currentText(), self)
self.verticalLayout_2.addWidget(self.widget)
if __name__ == '__main__':
app = QtWidgets.QApplication([])
app.setStyle('Fusion')
application = Start_Window()
application.show()
sys.exit(app.exec_())

