Найти - Пользователи
Полная версия: pyQt5 Как вызвать QFileDialog
Начало » GUI » pyQt5 Как вызвать QFileDialog
1 2
Vuramu
Python изучать начал недавно, ни одной книги пока не прочитал, решив пока гуглом обойтись, так как кое-какой опыт работы на других языках имеется.

Хочу, в целях экономии времени в будущем, написать небольшую программку, которая будет проделывать операцию конвертирования файла UI через консоль автоматически.

Сразу встала такая проблема: Создаю форму через QtDesigner, конвертирую ее через pyuic5 и уже в питоновском файле добавляю функцию “showDialog”, предварительно привязав его к сигналу clicked объекта pushButton. При нажатии на эту кнопку приложение вылетает с критической ошибкой.

В аналогичном примере все работало, но там класс по-другому инициализировался и полностью вручную писался. Подскажите что здесь не так.

Вот сам файл:
 from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(417, 210)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setMinimumSize(QtCore.QSize(55, 0))
        self.label.setMaximumSize(QtCore.QSize(55, 20))
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.leQt = QtWidgets.QLineEdit(self.centralwidget)
        self.leQt.setObjectName("leQt")
        self.horizontalLayout.addWidget(self.leQt)
        self.pushButton_4 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout.addWidget(self.pushButton_4)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setMinimumSize(QtCore.QSize(55, 0))
        self.label_2.setMaximumSize(QtCore.QSize(55, 20))
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.leUI = QtWidgets.QLineEdit(self.centralwidget)
        self.leUI.setObjectName("leUI")
        self.horizontalLayout_2.addWidget(self.leUI)
        self.pushButton_3 = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.pushButton = QtWidgets.QPushButton(self.centralwidget) # ЭТОТ ОБЪЕКТ
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(self.showDialog) # ЗАКОННЕКТИЛ ФУНКЦИЮ
        self.verticalLayout.addWidget(self.pushButton)
        MainWindow.setCentralWidget(self.centralwidget)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Конвертирование UI в Py"))
        self.label.setText(_translate("MainWindow", "PYUIC5.bat"))
        self.pushButton_4.setText(_translate("MainWindow", "Обзор"))
        self.label_2.setText(_translate("MainWindow", "UI"))
        self.pushButton_3.setText(_translate("MainWindow", "Обзор"))
        self.pushButton.setText(_translate("MainWindow", "Конвертировать"))
    def showDialog(self):
        fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')[0]
        if (fname != ""):
            f = open(fname, 'r')
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(MainWindow)
    MainWindow.show()
    sys.exit(app.exec_())

Kyrym
Попробуйте так:
 fname, _ = QFileDialog.getOpenFileName...
Т.е. добавить запятую и нижнее подчёркивание. Это в PyQT5 так работает.
Vuramu
Kyrym
Попробуйте так:
эффект, к сожалению, тот же.

Пробовал так:

  def showDialog(self):
        try:
            options = QtWidgets.QFileDialog.Options()
            options |= QtWidgets.QFileDialog.DontUseNativeDialog
            fname, _ = QtWidgets.QFileDialog.getSaveFileName(self,"QFileDialog.getSaveFileName()","","All Files (*);;Text Files (*.txt)", options=options)
            #if (fname != ""):
             #   f = open(fname, 'r')
            self.leUI.setText(fname)
        except:
            self.leUI.setText("Ошибка")

на строке инициализации fname выбивает в except
vic57
Vuramu
https://pythonspot.com/pyqt5-file-dialog/
запусти из консоли python -v my_script покажи ошибки
Vuramu
vic57
запусти из консоли python -v my_script покажи ошибки

# code object from ‘E:\\Program Files\\Python 3.6\\lib\\encodings\\__pycache__\\cp1251.cpython-36.pyc’
import ‘encodings.cp1251’ # <_frozen_importlib_external.SourceFileLoader object at 0x05C2C4D0>
Traceback (most recent call last):
File “MainForm.py”, line 89, in showDialog
“All Files (*);;Python Files (*.py)”, options=options)
TypeError: getOpenFileNames(parent: QWidget = None, caption: str = ‘', directory: str = ’', filter: str = ‘', initialFilter: str = ’', options: Union = 0): argument 1 has unexpected type ‘Ui_MainWindow’

PEHDOM
Kyrym
Т.е. добавить запятую и нижнее подчёркивание. Это в PyQT5 так работает.
в данном случае это не нужно, там в конце стоит нолик в скобках квадратных -брать первый элемент списка.
Vuramu
При нажатии на эту кнопку приложение вылетает с критической ошибкой.
ну оно же чтото пишет вам при вылете, почитайте. Вангую что там написано что перменная QFileDialog не определена, или чтото типа такого.
если он часть модуля QtWidgets то и вызывайте соответсвенно QtWidgets.QFileDialog…..

Vuramu
argument 1 has unexpected type ‘Ui_MainWindow’
ну дык, Ui_MainWindow у вас от обджекта наследуеться, а родитель у файлдиалога, должен быть наследником QWidget или вообще не указыайться..
по идее вам нужно указывать родителем MainWindow, но у вас все через жопу написано, почему вы не наследуете ваш Ui_MainWindow от QMainWindow?
vic57
Vuramu
argument 1 has unexpected type ‘Ui_MainWindow’
 from PyQt5.Qt import *
class W(QMainWindow):
	def __init__(self,parent=None):
		QMainWindow.__init__(self,parent)
		#...
Vuramu
PEHDOM
почему вы не наследуете ваш Ui_MainWindow от QMainWindow?
Читайте пост внимательно. Я уже указывал, что это файл я не вручную написал, его сгенерировал QtDesigner

PEHDOM
ну оно же чтото пишет вам при вылете, почитайте.
Никакого сообщения нет. Интерпретатор python просто вылетает, а ОС якобы ищет способы устранения ошибки, но разумеется не находит и предлагает принудительно завершить процесс.
В консоли пишет что-то вроде “Process finished with exit code -1073740791 (0xC0000409)”, что ни о чем мне не говорит.

vic57
ваше решение не практично, так как слишком напряжно постоянно так сильно редактировать сгенерированный файл. Поступил проще: диалогу отправил в параметр не self, а self.centralwidget.



Kyrym
PEHDOM
в данном случае это не нужно, там в конце стоит нолик в скобках квадратных -брать первый элемент списка.
Да. я потом уже увидел.
PEHDOM
Vuramu
ваше решение не практично, так как слишком напряжно постоянно так сильно редактировать сгенерированный файл. Поступил проще: диалогу отправил в параметр не self, а self.centralwidget.
а нафг вы вообще этим заморачиваетесь? не практичнее подключать .ui через uic.loadUI?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB