Как вывести результат модуля в окне (собранном в Qt Designer) и передать на сохранение другому диалоговому окну?
Подскажите, пожалуйста, как передать результат работы программы, например, DataFrame:
import pandas as pd
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
dF = pd.DataFrame(a, columns=['row_min', 'row_max', 'detector_min', 'detector_max'])
в окно PyQt5, а далее перейти в другое диалоговое окно для сохранения в файл .csv? Как связать эти 2 окна(2 модуля) через событие 'Сохранить'? Заранее благодарю за помощь.
Код окна, созданного в Qt Designer для отображения результата:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_widget(object):
def setupUi(self, widget):
widget.setObjectName("widget")
widget.setEnabled(True)
widget.resize(250, 200)
font = QtGui.QFont()
font.setFamily("Verdana")
widget.setFont(font)
widget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label = QtWidgets.QLabel(widget)
self.label.setGeometry(QtCore.QRect(20, 10, 211, 121))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton_2 = QtWidgets.QPushButton(widget)
self.pushButton_2.setGeometry(QtCore.QRect(150, 160, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton = QtWidgets.QPushButton(widget)
self.pushButton.setGeometry(QtCore.QRect(20, 160, 75, 23))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(widget)
QtCore.QMetaObject.connectSlotsByName(widget)
def retranslateUi(self, widget):
_translate = QtCore.QCoreApplication.translate
widget.setWindowTitle(_translate("widget", "Результат"))
self.label.setText(_translate("widget", "DataFrame"))
self.pushButton_2.setText(_translate("widget", "Отмена"))
self.pushButton.setText(_translate("widget", "Сохранить"))
if __name__ == '__main__':
import pandas as pd
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
dF = pd.DataFrame(a, columns=['row_min', 'row_max', 'detector_min', 'detector_max'])
import sys
app = QtWidgets.QApplication(sys.argv)
window = Ui_widget()
window.retranslateUi.label.setText(dF) # Здесь возникает ошибка
window.show()
sys.exit(app.exec_())
Код диалогового окна для сохранения файла:
import sys
from PyQt5.QtWidgets import QWidget, QApplication, QFileDialog
class App(QWidget):
def __init__(self):
super().__init__()
self.left = 500
self.top = 300
self.width = 640
self.height = 480
self.initUI()
def initUI(self):
self.setGeometry(self.left, self.top, self.width, self.height)
def saveFileNameDialog(self):
fileName = QFileDialog.getSaveFileName(self, 'Сохранить как ', '/path/to/default/FileName', '*.csv')
if fileName:
return fileName
if __name__ == '__main__':
app = QApplication(sys.argv)
file = App().saveFileNameDialog()
Возможно, для отображения результата лучше подойдет другой тип окна.
Ответы (1 шт):
Я думаю, что вам пока не нужно создавать никакие дополнительные окна. Попробуйте так:
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_widget(object):
def setupUi(self, widget):
widget.setObjectName("widget")
widget.setEnabled(True)
widget.resize(250, 200)
font = QtGui.QFont()
font.setFamily("Verdana")
widget.setFont(font)
widget.setLayoutDirection(QtCore.Qt.LeftToRight)
self.label = QtWidgets.QLabel(widget)
self.label.setGeometry(QtCore.QRect(20, 10, 211, 121))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.pushButton_2 = QtWidgets.QPushButton(widget)
self.pushButton_2.setGeometry(QtCore.QRect(150, 160, 75, 23))
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton = QtWidgets.QPushButton(widget)
self.pushButton.setGeometry(QtCore.QRect(20, 160, 75, 23))
self.pushButton.setObjectName("pushButton")
self.retranslateUi(widget)
QtCore.QMetaObject.connectSlotsByName(widget)
def retranslateUi(self, widget):
_translate = QtCore.QCoreApplication.translate
widget.setWindowTitle(_translate("widget", "Результат"))
self.label.setText(_translate("widget", "DataFrame"))
self.pushButton_2.setText(_translate("widget", "Отмена"))
self.pushButton.setText(_translate("widget", "Сохранить"))
class Main(QtWidgets.QWidget, Ui_widget):
def __init__(self):
super().__init__()
self.setupUi(self)
self.pushButton.clicked.connect(self.saveFileNameDialog)
a = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
self.dF = pd.DataFrame(a, columns=['row_min', 'row_max', 'detector_min', 'detector_max'])
#print(type(self.dF), self.dF)
self.label.setText(str(self.dF))
self.label.adjustSize()
def saveFileNameDialog(self):
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
self,
'Сохранить как CSV',
'.', #'/path/to/default/FileName',
'CSV(*.csv)'
)
#print(fileName)
if fileName:
self.dF.to_csv(fileName)
msg = QtWidgets.QMessageBox.information(
self,
'Title',
f'Content: информация сохранена в файл {fileName}')
if __name__ == '__main__':
import pandas as pd
import sys
app = QtWidgets.QApplication(sys.argv)
window = Main() #Ui_widget()
window.resize(400, 200)
window.show()
sys.exit(app.exec_())
Update
...ошибка на стадии создании экземпляра класса Main() (window = Main() NameError: name 'Main' is not defined).
определите класс Main
class Main(QtWidgets.QWidget, Ui_widget):
...
Каким методом можно вывести dF в отформатированном виде, например, в таблице?
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt
import pandas as pd
class TableModel(QtCore.QAbstractTableModel):
def __init__(self, data):
super(TableModel, self).__init__()
self._data = data
def data(self, index, role):
if role == Qt.DisplayRole:
value = self._data.iloc[index.row(), index.column()]
return str(value)
def rowCount(self, index):
return self._data.shape[0]
def columnCount(self, index):
return self._data.shape[1]
def headerData(self, section, orientation, role):
# section это index of the column/row.
if role == Qt.DisplayRole:
if orientation == Qt.Horizontal:
return str(self._data.columns[section])
if orientation == Qt.Vertical:
return str(self._data.index[section])
class MainWindow(QtWidgets.QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget= QtWidgets.QWidget()
self.setCentralWidget(self.centralWidget)
self.table = QtWidgets.QTableView()
self.table.horizontalHeader().setStretchLastSection(True)
self.data = pd.DataFrame(
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
],
columns = ['row_min', 'row_max', 'detector_min', 'detector_max'],
index = ['Row 1', 'Row 2', 'Row 3']
)
self.model = TableModel(self.data)
self.table.setModel(self.model)
self.btn = QtWidgets.QPushButton("Сохранить как CSV.")
self.btn.clicked.connect(self.saveFileNameDialog)
layout = QtWidgets.QGridLayout(self.centralWidget)
layout.addWidget(self.table, 0, 0)
layout.addWidget(self.btn, 1, 0, alignment=Qt.AlignRight)
def saveFileNameDialog(self):
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
self,
'Сохранить как CSV',
'.', #'/path/to/default/FileName',
'CSV(*.csv)'
)
if fileName:
self.data.to_csv(fileName)
msg = QtWidgets.QMessageBox.information(
self,
'Title',
f'Content: информация сохранена в файл {fileName}')
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.resize(500, 200)
window.show()
sys.exit(app.exec_())

