Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 30, 2017 09:04:11

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

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_())

Отредактировано Vuramu (Дек. 30, 2017 10:25:58)

Офлайн

#2 Янв. 1, 2018 13:22:05

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

Попробуйте так:

 fname, _ = QFileDialog.getOpenFileName...
Т.е. добавить запятую и нижнее подчёркивание. Это в PyQT5 так работает.

Офлайн

#3 Янв. 2, 2018 12:14:08

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

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

Отредактировано Vuramu (Янв. 2, 2018 13:02:34)

Офлайн

#4 Янв. 2, 2018 13:11:11

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

Vuramu
https://pythonspot.com/pyqt5-file-dialog/
запусти из консоли python -v my_script покажи ошибки

Отредактировано vic57 (Янв. 2, 2018 13:13:28)

Офлайн

#5 Янв. 2, 2018 13:47:30

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

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’

Отредактировано Vuramu (Янв. 2, 2018 14:17:04)

Офлайн

#6 Янв. 2, 2018 14:20:17

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

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

Vuramu
argument 1 has unexpected type ‘Ui_MainWindow’
ну дык, Ui_MainWindow у вас от обджекта наследуеться, а родитель у файлдиалога, должен быть наследником QWidget или вообще не указыайться..
по идее вам нужно указывать родителем MainWindow, но у вас все через жопу написано, почему вы не наследуете ваш Ui_MainWindow от QMainWindow?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Янв. 2, 2018 14:30:12)

Офлайн

#7 Янв. 2, 2018 14:36:48

vic57
Зарегистрирован: 2015-07-07
Сообщения: 908
Репутация: +  127  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

Vuramu
argument 1 has unexpected type ‘Ui_MainWindow’
 from PyQt5.Qt import *
class W(QMainWindow):
	def __init__(self,parent=None):
		QMainWindow.__init__(self,parent)
		#...

Офлайн

#8 Янв. 2, 2018 15:23:00

Vuramu
Зарегистрирован: 2017-12-30
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

PEHDOM
почему вы не наследуете ваш Ui_MainWindow от QMainWindow?
Читайте пост внимательно. Я уже указывал, что это файл я не вручную написал, его сгенерировал QtDesigner

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

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



Отредактировано Vuramu (Янв. 2, 2018 15:41:53)

Офлайн

#9 Янв. 2, 2018 16:26:22

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

PEHDOM
в данном случае это не нужно, там в конце стоит нолик в скобках квадратных -брать первый элемент списка.
Да. я потом уже увидел.

Офлайн

#10 Янв. 2, 2018 16:55:14

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

pyQt5 Как вызвать QFileDialog

Vuramu
ваше решение не практично, так как слишком напряжно постоянно так сильно редактировать сгенерированный файл. Поступил проще: диалогу отправил в параметр не self, а self.centralwidget.
а нафг вы вообще этим заморачиваетесь? не практичнее подключать .ui через uic.loadUI?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version