Текст программы
«mainF.py»
import sys
import os
from statistics import mean
import numpy as np
import sqlite3
import matplotlib
matplotlib.use('Qt5Agg')
import design
import PyQt5
from design import Ui_MainWindow
from PyQt5 import QtWidgets
from PyQt5 import uic
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QMessageBox, QDialog
from PyQt5.uic import loadUi
class RitmApp(QMainWindow, Ui_MainWindow, QDialog):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.open_file)
self.pushButton_2.clicked.connect(self.addToDB)
self.pushButton_4.clicked.connect(self.getPredict)
self.tableWidget.setColumnWidth(0,180)
self.tableWidget.setColumnWidth(1,160)
self.tableWidget.setColumnWidth(2,248)
self.tabWidget.tabBarClicked.connect(self.getFromDB)
self.initialLoadFromDB()
def open_file(self):
path = QFileDialog.getOpenFileName(self, "Open", "", "txt Files (*.txt);;All Files (*)")
if path[0] != "":
self.lineEdit_6.setText("")
data = np.genfromtxt(path[0])
data = data[0:len(data)-1]
maxRR = max(data)*1.2
dH = 0.05
X = np.arange(0,maxRR,dH)
H, bins_edges = np.histogram(data, X)
SH = H.sum()
PH = H/SH*100
X1 = X[0:len(X)-1]+0.025
RRsr = mean(data)
RRmin = min(data)
RRmax = max(data)
dRR = RRmax - RRmin
iMo = np.argmax(PH)
Mo = iMo*dH+0.05
self.lineEdit_5.setText(path[0])
self.MplWidget.axes.clear()
self.MplWidget.axes.stem(range(0,len(data)), data, markerfmt = "none")
self.MplWidget.axes.set_title(f'Ритмограмма \nRRsr = {np.around(RRsr,2)}, RRmin = {np.around(RRmin,2)} \nRRmax = {np.around(RRmax,2)}, dRR = {np.around(dRR,2)}, Mo = {np.around(Mo,2)}')
self.MplWidget.axes.set_xlabel('RR')
self.MplWidget.axes.set_ylabel('R-R интервалы, сек')
self.MplWidget.canvas.draw()
self.MplWidget2.axes.clear()
self.MplWidget2.axes.bar(X1,PH,0.05)
self.MplWidget2.axes.set_title('Гистограмма')
self.MplWidget2.axes.set_xlabel('R-R интервалы, сек')
self.MplWidget2.axes.set_ylabel('Кол-во ед.')
self.MplWidget2.canvas.draw()
self.MplWidget3.axes.clear()
self.MplWidget3.axes.scatter(data[1:len(data)-1], data[2:len(data)])
self.MplWidget3.axes.set_title('Скаттерограмма')
self.MplWidget3.axes.set_xlabel('RR(1:L-1)')
self.MplWidget3.axes.set_ylabel('RR(2:L)')
self.MplWidget3.canvas.draw()
def addToDB(self):
path = os.path.dirname(os.path.abspath(__file__))
db = os.path.join(path, 'ritmogramma.db')
con = sqlite3.connect(db)
cur = con.cursor()
cur.execute("""INSERT INTO users (name,age,file,diagnosis)
VALUES (?,?,?,?)""",
(self.lineEdit.text()+" "+self.lineEdit_2.text()+" "+self.lineEdit_3.text(),
self.lineEdit_4.text(),self.lineEdit_5.text(),self.lineEdit_6.text()))
con.commit()
con.close()
QMessageBox.about(self, "Статус выполнения операции", "Успешно сохранено")
def getFromDB(self, tabIndex):
if tabIndex == 1:
path = os.path.dirname(os.path.abspath(__file__))
db = os.path.join(path, 'ritmogramma.db')
con = sqlite3.connect(db)
cur = con.cursor()
cur.execute("""SELECT name, age, file, diagnosis FROM users""")
res = cur.fetchall()
con.close()
tableRow = 0
self.tableWidget.setRowCount(len(res))
for row in res:
self.tableWidget.setItem(tableRow, 0, QtWidgets.QTableWidgetItem(f"{row[0]}, {row[1]}"))
self.tableWidget.setItem(tableRow, 1, QtWidgets.QTableWidgetItem(row[3]))
self.tableWidget.setItem(tableRow, 2, QtWidgets.QTableWidgetItem(row[2]))
tableRow += 1
def getPredict(self):
path = self.lineEdit_5.text()
if len(path) != 0:
data = np.genfromtxt(path)
data = data[0:len(data)-1]
maxRR = max(data)*1.2
dH = 0.05
X = np.arange(0,maxRR,dH)
H, bins_edges = np.histogram(data, X)
SH = H.sum()
PH = H/SH*100
X1 = X[0:len(X)-1]+0.025
RRsr = mean(data)
RRmin = min(data)
RRmax = max(data)
dRR = RRmax - RRmin
iMo = np.argmax(PH)
Mo = iMo*dH+0.05
if 0.4 < RRmin < 0.55 and 0.8 < RRmax < 0.9:
self.lineEdit_6.setText("Желудочковая экстрасистолия")
elif RRmin < 0.4 and RRmax > 0.9:
self.lineEdit_6.setText("Мерцательная аритмия")
elif 0.55 < RRmin < 0.65 and 0.65 < RRmax < 0.75:
self.lineEdit_6.setText("Здоров(-а)")
else:
QMessageBox.about(self, "Статус выполнения операции", "Выберите сигнал")
def initialLoadFromDB(self):
path1 = __file__
path = os.path.dirname(os.path.abspath(__file__))
db = os.path.join(path, 'ritmogramma.db')
con = sqlite3.connect(db)
cur = con.cursor()
cur.execute("""SELECT name, age, file, diagnosis FROM users""")
res = cur.fetchall()
con.close()
tableRow = 0
self.tableWidget.setRowCount(len(res))
for row in res:
self.tableWidget.setItem(tableRow, 0, QtWidgets.QTableWidgetItem(f"{row[0]}, {row[1]}"))
self.tableWidget.setItem(tableRow, 1, QtWidgets.QTableWidgetItem(row[3]))
self.tableWidget.setItem(tableRow, 2, QtWidgets.QTableWidgetItem(row[2]))
tableRow += 1
def keyPressEvent(self, event):
if event.key() in (PyQt5.QtCore.Qt.Key_Backspace, PyQt5.QtCore.Qt.Key_Delete):
if self.tableWidget.selectionModel().hasSelection():
indices = self.tableWidget.selectionModel().selectedRows()
for index in sorted(indices):
self.tableWidget.removeRow(index.row())
if self.tableWidget.rowCount() == 0:
self.tableWidget.setColumnWidth(2,263)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = RitmApp()
window.show()
sys.exit(app.exec_())
«mplwidget.py»
from PyQt5.QtWidgets import QWidget, QVBoxLayout
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt5agg import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure
class MplWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.canvas = FigureCanvas(Figure())
self.axes = self.canvas.figure.add_subplot(111)
self.toolbar = NavigationToolbar(self.canvas, self)
layout = QVBoxLayout()
layout.setContentsMargins(0, 0, 0, 0)
layout.addWidget(self.toolbar)
layout.addWidget(self.canvas)
self.setLayout(layout)