LINUX.ORG.RU

PyQt5. Работа с открываемым файлом Exsel

 , ,


0

1

Здравствуйте. Из-за маленького срока изучения языка возникла следующая проблема. Назначила кнопке «Открыть» действие вызова диалогового окна поcредством QFileDialog (необходимо выбрать Exsel файл). Также есть отдельный модуль, который открывает файл Exsel с помощью Pandas и производит считывание данных в списки и работает дальше с ними. Вопрос в следующем, как передать Pandas открытый с помощью QFileDialog файл Exsel? Удобно оказалось работать с пандасом. Спасибо. Код моей формочки

 
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Coll(object):
    def setupUi(self, Coll):
        Coll.setObjectName("Coll")
        Coll.setFixedSize(807, 562)
        self.widget = QtWidgets.QWidget(Coll)
        self.widget.setObjectName("widget")
        self.build_coll = QtWidgets.QPushButton(self.widget)
        self.build_coll.setGeometry(QtCore.QRect(10, 100, 371, 23))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(9)
        self.build_coll.setFont(font)
        self.build_coll.setObjectName("build_coll")
        self.groupBox = QtWidgets.QGroupBox(self.widget)
        self.groupBox.setGeometry(QtCore.QRect(10, 140, 781, 380))
        self.groupBox.setTitle("")
        self.groupBox.setObjectName("groupBox")
        self.type_coll = QtWidgets.QPushButton(self.widget)
        self.type_coll.setGeometry(QtCore.QRect(420, 100, 361, 23))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(9)
        self.type_coll.setFont(font)
        self.type_coll.setObjectName("type_coll")
        self.select_auth = QtWidgets.QComboBox(self.widget)
        self.select_auth.setGeometry(QtCore.QRect(420, 10, 361, 20))
        self.select_auth.setObjectName("select_auth")
        self.label_3 = QtWidgets.QLabel(self.widget)
        self.label_3.setGeometry(QtCore.QRect(10, 40, 245, 17))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(11)
        self.label_3.setFont(font)
        self.label_3.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.label_3.setObjectName("label_3")
        self.label_2 = QtWidgets.QLabel(self.widget)
        self.label_2.setGeometry(QtCore.QRect(10, 60, 24, 19))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label_2.setFont(font)
        self.label_2.setObjectName("label_2")
        self.label = QtWidgets.QLabel(self.widget)
        self.label.setGeometry(QtCore.QRect(420, 60, 24, 19))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(12)
        self.label.setFont(font)
        self.label.setObjectName("label")

        
        self.load_auth = QtWidgets.QPushButton(self.widget)
        self.load_auth.setGeometry(QtCore.QRect(10, 10, 381, 23))
        
        
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(9)
        self.load_auth.setFont(font)
        self.load_auth.setObjectName("load_auth")
        self.label_4 = QtWidgets.QLabel(self.widget)
        self.label_4.setGeometry(QtCore.QRect(420, 40, 340, 17))
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(11)
        self.label_4.setFont(font)
        self.label_4.setObjectName("label_4")
        Coll.setCentralWidget(self.widget)
        self.menubar = QtWidgets.QMenuBar(Coll)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 807, 21))
        self.menubar.setObjectName("menubar")
        self.menu = QtWidgets.QMenu(self.menubar)
        self.menu.setObjectName("menu")
        Coll.setMenuBar(self.menubar)
        self.open = QtWidgets.QAction(Coll)
        self.open.setObjectName("open")
        self.open.setShortcut('Ctrl+O')

        self.save = QtWidgets.QAction(Coll)
        self.save.setObjectName("save")
        self.save.setShortcut('Ctrl+S')
        self.exit = QtWidgets.QAction(Coll)
        self.exit.setObjectName("exit")
        self.exit.setShortcut('Ctrl+Q')
        self.menu.addAction(self.open)
        self.menu.addAction(self.save)
        self.menu.addAction(self.exit)
        self.menubar.addAction(self.menu.menuAction())

        self.retranslateUi(Coll)
        QtCore.QMetaObject.connectSlotsByName(Coll)

  
    def retranslateUi(self, Coll):
        _translate = QtCore.QCoreApplication.translate
        Coll.setWindowTitle(_translate("Coll", "Collaboration"))
        self.build_coll.setText(_translate("Coll", "Построить"))
        self.type_coll.setText(_translate("Coll", "Определить тип"))
        self.label_3.setText(_translate("Coll", "Количество"))
        self.label_2.setText(_translate("Coll", "000"))
        self.label.setText(_translate("Coll", "000"))
        self.load_auth.setText(_translate("Coll", "Загрузить список"))
        self.label_4.setText(_translate("Coll", "Средний:"))
        self.menu.setTitle(_translate("Coll", "Файл"))
        self.open.setText(_translate("Coll", "Открыть"))
        self.save.setText(_translate("Coll", "Сохранить данные"))
        self.exit.setText(_translate("Coll", "Выход"))

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Coll()
        self.ui.setupUi(self)
        self.ui.open.triggered.connect(self.open_file)
        self.ui.exit.triggered.connect(self.close)
        self.show()
        
    def open_file(self):
        fname = QtWidgets.QFileDialog.getOpenFileName(self, 'Выберите файл', 'c:\\',
            "Файлы Exsel (*.xlsx)",'/home')
        return fname

    def closeEvent(self, event):
        def closed():
            self.reply.close()
            event.ignore()
        self.reply = QtWidgets.QDialog()
        self.reply.setWindowTitle("Выход из приложения")
        vbox = QtWidgets.QVBoxLayout()
        label_dialog = QtWidgets.QLabel()
        label_dialog.setText('Вы действительно хотите выйти из приложения?')
        button_yes = QtWidgets.QPushButton(self.reply)
        button_yes.setText("Да")
        button_yes.clicked.connect(lambda: self.reply.close())
        button_no = QtWidgets.QPushButton(self.reply)
        button_no.setText('Нет')
        button_no.clicked.connect(closed)
        layout = QtWidgets.QHBoxLayout()
        layout.addWidget(button_yes)
        layout.addWidget(button_no)
        vbox.addWidget(label_dialog)
        vbox.addSpacing(20)
        vbox.addLayout(layout)
        self.reply.setLayout(vbox)
        self.reply.exec()

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    dl = MainWindow()
    sys.exit(app.exec_())

Хотя я совсем не знаю пистон. Во первых правильное название проги excel.


def open_file(self):
        fname = QtWidgets.QFileDialog.getOpenFileName(self, 'Выберите файл', 'c:\\',
            "Файлы Exsel (*.xlsx)",'/home')
        return fname

xl = pd.ExcelFile(open_file (self)) &

так ты получаешь указатель (или что там в питоне) на объект типа «экселевский файл» инициализированный выбранным файлом?

Bobby_
()

Во-первых, подозреваю, что не Exsel, а Exсel. Ну или я не знаю, что это такое.

Во-вторых.

как передать Pandas открытый с помощью QFileDialog файл

Надо понять, кто чем занимается. QFileDialog сам по себе никаких файлов не открывает. Он просто позволяет пользователю выбрать файл и возвращает путь к выбранному файлу в виде строки (тут тоже есть нюансы, например, надо проверять, не нажал ли пользователь на отмену). Вот эту строку надо и скормить pandas.read_excel или чего у вас там. Судя по документации, её надо приводить к URL-у file://..., но я сам с pandas не работал - проверяйте.

В третьих, у вас в getOpenFileName по умолчанию подсовывается виндоспецифичный путь к c:\ - это плохо. Его бы лучше запоминать в настройках, а самое первое значение по умолчанию брать из QStandardPath, это кроссплатформенное решение.

hobbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.