Форум сайта python.su
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)
Офлайн
Попробуйте так:
fname, _ = QFileDialog.getOpenFileName...
Офлайн
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("Ошибка")
Отредактировано Vuramu (Янв. 2, 2018 13:02:34)
Офлайн
Vuramu
https://pythonspot.com/pyqt5-file-dialog/
запусти из консоли python -v my_script покажи ошибки
Отредактировано vic57 (Янв. 2, 2018 13:13:28)
Офлайн
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)
Офлайн
Kyrymв данном случае это не нужно, там в конце стоит нолик в скобках квадратных -брать первый элемент списка.
Т.е. добавить запятую и нижнее подчёркивание. Это в PyQT5 так работает.
Vuramuну оно же чтото пишет вам при вылете, почитайте. Вангую что там написано что перменная QFileDialog не определена, или чтото типа такого.
При нажатии на эту кнопку приложение вылетает с критической ошибкой.
Vuramuну дык, Ui_MainWindow у вас от обджекта наследуеться, а родитель у файлдиалога, должен быть наследником QWidget или вообще не указыайться..
argument 1 has unexpected type ‘Ui_MainWindow’
[code python][/code]
Отредактировано PEHDOM (Янв. 2, 2018 14:30:12)
Офлайн
Vuramu
argument 1 has unexpected type ‘Ui_MainWindow’
from PyQt5.Qt import * class W(QMainWindow): def __init__(self,parent=None): QMainWindow.__init__(self,parent) #...
Офлайн
PEHDOMЧитайте пост внимательно. Я уже указывал, что это файл я не вручную написал, его сгенерировал QtDesigner
почему вы не наследуете ваш Ui_MainWindow от QMainWindow?
PEHDOMНикакого сообщения нет. Интерпретатор python просто вылетает, а ОС якобы ищет способы устранения ошибки, но разумеется не находит и предлагает принудительно завершить процесс.
ну оно же чтото пишет вам при вылете, почитайте.
vic57ваше решение не практично, так как слишком напряжно постоянно так сильно редактировать сгенерированный файл. Поступил проще: диалогу отправил в параметр не self, а self.centralwidget.
Отредактировано Vuramu (Янв. 2, 2018 15:41:53)
Офлайн
PEHDOMДа. я потом уже увидел.
в данном случае это не нужно, там в конце стоит нолик в скобках квадратных -брать первый элемент списка.
Офлайн
Vuramuа нафг вы вообще этим заморачиваетесь? не практичнее подключать .ui через uic.loadUI?
ваше решение не практично, так как слишком напряжно постоянно так сильно редактировать сгенерированный файл. Поступил проще: диалогу отправил в параметр не self, а self.centralwidget.
[code python][/code]
Офлайн