Построения графика pyqtgraph в PyQt5
Имеется таблица QTableWidget, в которую пользователь вносит данные, после чего на основании этих данных должен строится график.
Сейчас программа по нажатию на кнопку выводит данные из таблицы в массив, как сделать так, чтобы на их основе строился график во вкладке "График"?
Во вкладке "График" уже есть PlotWidget.
graph_log.py
import os
import sys
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from test_graph import Ui_MainWindow
app = QApplication(sys.argv)
Window = QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(Window)
Window.setFixedSize(320, 240)
Window.show()
def pushButton():
rows = ui.tableWidget.rowCount()
cols = ui.tableWidget.columnCount()
data = []
for row in range(rows):
tmp = []
for col in range(cols):
try:
tmp.append(ui.tableWidget.item(row, col).text())
except:
tmp.append('')
data.append(tmp)
data_for_word = []
for i in data: print(i)
for i in data:
if i[0] != '':
data_for_word.append(i)
ui.pushButton.clicked.connect(pushButton)
sys.exit(app.exec_())
test_graph.py
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from pyqtgraph import PlotWidget
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(320, 240)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setObjectName(u"tabWidget")
self.tab = QWidget()
self.tab.setObjectName(u"tab")
self.gridLayout_3 = QGridLayout(self.tab)
self.gridLayout_3.setObjectName(u"gridLayout_3")
self.tableWidget = QTableWidget(self.tab)
if (self.tableWidget.columnCount() < 2):
self.tableWidget.setColumnCount(2)
__qtablewidgetitem = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
if (self.tableWidget.rowCount() < 3):
self.tableWidget.setRowCount(3)
__qtablewidgetitem2 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, __qtablewidgetitem2)
__qtablewidgetitem3 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, __qtablewidgetitem3)
__qtablewidgetitem4 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, __qtablewidgetitem4)
self.tableWidget.setObjectName(u"tableWidget")
self.tableWidget.horizontalHeader().setDefaultSectionSize(130)
self.gridLayout_3.addWidget(self.tableWidget, 0, 0, 1, 1)
self.pushButton = QPushButton(self.tab)
self.pushButton.setObjectName(u"pushButton")
self.gridLayout_3.addWidget(self.pushButton, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.gridLayout_2 = QGridLayout(self.tab_2)
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.widget = PlotWidget(self.tab_2)
self.widget.setObjectName(u"widget")
self.gridLayout_2.addWidget(self.widget, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 320, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QMetaObject.connectSlotsByName(MainWindow)
# setupUi
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"1", None));
___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"2", None));
___qtablewidgetitem2 = self.tableWidget.verticalHeaderItem(0)
___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"1", None));
___qtablewidgetitem3 = self.tableWidget.verticalHeaderItem(1)
___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"2", None));
___qtablewidgetitem4 = self.tableWidget.verticalHeaderItem(2)
___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"3", None));
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u0422\u0430\u0431\u043b\u0438\u0446\u0430", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u0413\u0440\u0430\u0444\u0438\u043a", None))
# retranslateUi
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Я увидел вашу задачу так:
import sys
from datetime import datetime # +++
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
from pyqtgraph import PlotWidget, plot # +++
import pyqtgraph as pg # +++
#from test_ui import Ui_MainWindow
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
if not MainWindow.objectName():
MainWindow.setObjectName(u"MainWindow")
MainWindow.resize(320, 240)
self.centralwidget = QWidget(MainWindow)
self.centralwidget.setObjectName(u"centralwidget")
self.gridLayout = QGridLayout(self.centralwidget)
self.gridLayout.setObjectName(u"gridLayout")
self.tabWidget = QTabWidget(self.centralwidget)
self.tabWidget.setObjectName(u"tabWidget")
self.tab = QWidget()
self.tab.setObjectName(u"tab")
self.gridLayout_3 = QGridLayout(self.tab)
self.gridLayout_3.setObjectName(u"gridLayout_3")
self.tableWidget = QTableWidget(self.tab)
if (self.tableWidget.columnCount() < 2):
self.tableWidget.setColumnCount(2)
__qtablewidgetitem = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, __qtablewidgetitem)
__qtablewidgetitem1 = QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, __qtablewidgetitem1)
if (self.tableWidget.rowCount() < 3):
self.tableWidget.setRowCount(3)
__qtablewidgetitem2 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(0, __qtablewidgetitem2)
__qtablewidgetitem3 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(1, __qtablewidgetitem3)
__qtablewidgetitem4 = QTableWidgetItem()
self.tableWidget.setVerticalHeaderItem(2, __qtablewidgetitem4)
self.tableWidget.setObjectName(u"tableWidget")
self.tableWidget.horizontalHeader().setDefaultSectionSize(130)
self.gridLayout_3.addWidget(self.tableWidget, 0, 0, 1, 1)
self.pushButton = QPushButton(self.tab)
self.pushButton.setObjectName(u"pushButton")
self.gridLayout_3.addWidget(self.pushButton, 1, 0, 1, 1)
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QWidget()
self.tab_2.setObjectName(u"tab_2")
self.gridLayout_2 = QGridLayout(self.tab_2)
self.gridLayout_2.setObjectName(u"gridLayout_2")
self.widget = PlotWidget(self.tab_2)
self.widget.setObjectName(u"widget")
self.gridLayout_2.addWidget(self.widget, 0, 0, 1, 1)
self.tabWidget.addTab(self.tab_2, "")
self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 1)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QMenuBar(MainWindow)
self.menubar.setObjectName(u"menubar")
self.menubar.setGeometry(QRect(0, 0, 320, 21))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QStatusBar(MainWindow)
self.statusbar.setObjectName(u"statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(0)
QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
___qtablewidgetitem = self.tableWidget.horizontalHeaderItem(0)
___qtablewidgetitem.setText(QCoreApplication.translate("MainWindow", u"1", None));
___qtablewidgetitem1 = self.tableWidget.horizontalHeaderItem(1)
___qtablewidgetitem1.setText(QCoreApplication.translate("MainWindow", u"2", None));
___qtablewidgetitem2 = self.tableWidget.verticalHeaderItem(0)
___qtablewidgetitem2.setText(QCoreApplication.translate("MainWindow", u"1", None));
___qtablewidgetitem3 = self.tableWidget.verticalHeaderItem(1)
___qtablewidgetitem3.setText(QCoreApplication.translate("MainWindow", u"2", None));
___qtablewidgetitem4 = self.tableWidget.verticalHeaderItem(2)
___qtablewidgetitem4.setText(QCoreApplication.translate("MainWindow", u"3", None));
self.pushButton.setText(QCoreApplication.translate("MainWindow", u"\u041f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0433\u0440\u0430\u0444\u0438\u043a", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), QCoreApplication.translate("MainWindow", u"\u0422\u0430\u0431\u043b\u0438\u0446\u0430", None))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), QCoreApplication.translate("MainWindow", u"\u0413\u0440\u0430\u0444\u0438\u043a", None))
class TimeAxisItem(pg.AxisItem): # +++
def tickStrings(self, values, scale, spacing):
return [datetime.fromtimestamp(value) for value in values]
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.button_clicked)
for row in range(self.tableWidget.rowCount()):
hours, minutes = 15 + row, 12 + (row + 15)
date_from = QtWidgets.QDateTimeEdit()
date_from.setDateTime(
QtCore.QDateTime(
QtCore.QDate(2021, 9, 7),
QtCore.QTime(hours, minutes, 0)
)
)
self.tableWidget.setCellWidget(row, 0, date_from)
item = QTableWidgetItem()
_data = 5 * row
item.setData(Qt.DisplayRole, _data)
self.tableWidget.setItem(row, 1, item)
def button_clicked(self):
data_for_word = []
rows = self.tableWidget.rowCount()
for row in range(rows):
dateTime = self.tableWidget.cellWidget(row, 0).\
dateTime().toString('dd.MM.yyyy hh:mm')
item = self.tableWidget.item(row, 1)
_data = item.data(Qt.DisplayRole) if item else '0'
data_for_word.append([dateTime, _data])
self.x, self.y = [], []
for x, y in data_for_word:
self.x.append(datetime.strptime(x, '%d.%m.%Y %H:%M'))
self.y.append(float(y))
# !!! ВНИМАНИЕ
self.date_axis = TimeAxisItem(orientation='bottom')
self.widget = pg.PlotWidget(
axisItems = {'bottom': self.date_axis},
title= '<h2>Hello World</h2>'
)
pen = pg.mkPen(color=(255, 0, 0), width=2)
self.widget.plot(
x=[x.timestamp() for x in self.x],
y=self.y, pen=pen, symbol='o'
)
self.gridLayout_2.addWidget(self.widget, 0, 0, 1, 1)
# !!!
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())

