Ошибка при создании QfileDialog по нажатию кнопки для выбора файла
Пытаюсь сделать, чтобы при нажатии кнопки browse_2 вылизало диалоговое окно выбора файла, но увы выдает ошибку.
ОШИБКА:
Traceback (most recent call last):
File "/home/mazafaker/python/SUPER PROJECT v228/project stegano/main.py", line 76, in clicker
res = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', './', 'jpg')
TypeError: getOpenFileName(parent: QWidget = None, caption: str = '', directory: str = '', filter: str = '', initialFilter: str = '', options: Union[QFileDialog.Options, QFileDialog.Option] = 0): argument 1 has unexpected type 'Ui_MainWindow'
Process finished with exit code
Помогите.
# -*- coding: utf8 -*-
# импортируемые модули для проекта
import time
import os,sys
import pathlib
import wave
import numpy as np
import math
import cv2
import shutil
from math import ceil
from subprocess import call,STDOUT
from tqdm import tqdm
from stegano import lsb
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QFileDialog, QPushButton, QMainWindow, QLabel
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 110, 241, 17))
self.label_2.setStyleSheet("font: 9pt \"Ubuntu\";")
self.label_2.setObjectName("label_2")
self.browse_2 = QtWidgets.QPushButton(self.centralwidget)
self.browse_2.setGeometry(QtCore.QRect(250, 130, 89, 25))
self.browse_2.setObjectName("browse_2")
self.browse_2.findChild(QPushButton, 'browse_2')
self.browse_2.clicked.connect(self.clicker)
self.progressBar_2 = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar_2.setGeometry(QtCore.QRect(0, 250, 371, 23))
self.progressBar_2.setLayoutDirection(QtCore.Qt.LeftToRight)
self.progressBar_2.setAutoFillBackground(False)
self.progressBar_2.setProperty("value", 24)
self.progressBar_2.setObjectName("progressBar_2")
self.logo_2 = QtWidgets.QLabel(self.centralwidget)
self.logo_2.setGeometry(QtCore.QRect(60, 0, 251, 81))
self.logo_2.setText("")
self.logo_2.setPixmap(QtGui.QPixmap("./logo.png"))
self.logo_2.setObjectName("logo_2")
self.filename_2 = QtWidgets.QLineEdit(self.centralwidget)
self.filename_2.setGeometry(QtCore.QRect(10, 130, 221, 25))
self.filename_2.setObjectName("filename_2")
self.btnencrypt_2 = QtWidgets.QPushButton(self.centralwidget)
self.btnencrypt_2.setGeometry(QtCore.QRect(170, 190, 131, 41))
self.btnencrypt_2.setObjectName("btnencrypt_2")
self.btncrypt_2 = QtWidgets.QPushButton(self.centralwidget)
self.btncrypt_2.setGeometry(QtCore.QRect(20, 190, 131, 41))
self.btncrypt_2.setObjectName("btncrypt_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 377, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "Укажите путь к файлу:"))
self.browse_2.setText(_translate("MainWindow", "Обзор..."))
self.btnencrypt_2.setText(_translate("MainWindow", "Дешифровать"))
self.btncrypt_2.setText(_translate("MainWindow", "Зашифровать"))
def clicker(self):
res = QtWidgets.QFileDialog.getOpenFileName(self, 'Open File', './', 'jpg')
if __name__ == "__main__":
app=QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Не изменяйте код, сгенерированный Qt Designer. Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
Класс QFileDialog предоставляет диалоговое окно, позволяющее пользователям выбирать файлы или каталоги. Больше https://doc.qt.io/qt-5/qfiledialog.html
import sys
'''
import os
import time
import pathlib
import wave
import numpy as np
import math
import cv2
import shutil
from math import ceil
from subprocess import call,STDOUT
from tqdm import tqdm
from stegano import lsb
'''
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QDialog, QApplication, QFileDialog, \
QPushButton, QMainWindow, QLabel
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(400, 400)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.label_2 = QtWidgets.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 110, 241, 17))
self.label_2.setStyleSheet("font: 9pt \"Ubuntu\";")
self.label_2.setObjectName("label_2")
self.browse_2 = QtWidgets.QPushButton(self.centralwidget)
self.browse_2.setGeometry(QtCore.QRect(250, 130, 89, 25))
self.browse_2.setObjectName("browse_2")
self.browse_2.findChild(QPushButton, 'browse_2')
# self.browse_2.clicked.connect(self.clicker)
self.progressBar_2 = QtWidgets.QProgressBar(self.centralwidget)
self.progressBar_2.setGeometry(QtCore.QRect(0, 250, 371, 23))
self.progressBar_2.setLayoutDirection(QtCore.Qt.LeftToRight)
self.progressBar_2.setAutoFillBackground(False)
self.progressBar_2.setProperty("value", 24)
self.progressBar_2.setObjectName("progressBar_2")
self.logo_2 = QtWidgets.QLabel(self.centralwidget)
self.logo_2.setGeometry(QtCore.QRect(60, 0, 251, 81))
self.logo_2.setText("")
self.logo_2.setPixmap(QtGui.QPixmap("./logo.png"))
self.logo_2.setObjectName("logo_2")
self.filename_2 = QtWidgets.QLineEdit(self.centralwidget)
self.filename_2.setGeometry(QtCore.QRect(10, 130, 221, 25))
self.filename_2.setObjectName("filename_2")
self.btnencrypt_2 = QtWidgets.QPushButton(self.centralwidget)
self.btnencrypt_2.setGeometry(QtCore.QRect(170, 190, 131, 41))
self.btnencrypt_2.setObjectName("btnencrypt_2")
self.btncrypt_2 = QtWidgets.QPushButton(self.centralwidget)
self.btncrypt_2.setGeometry(QtCore.QRect(20, 190, 131, 41))
self.btncrypt_2.setObjectName("btncrypt_2")
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 377, 22))
self.menubar.setObjectName("menubar")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.label_2.setText(_translate("MainWindow", "Укажите путь к файлу:"))
self.browse_2.setText(_translate("MainWindow", "Обзор..."))
self.btnencrypt_2.setText(_translate("MainWindow", "Дешифровать"))
self.btncrypt_2.setText(_translate("MainWindow", "Зашифровать"))
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# !!! тут ваша логика
self.browse_2.clicked.connect(self.clicker) # !!!
def clicker(self): # !!!
res, _ = QtWidgets.QFileDialog.getOpenFileName(
self,
'Open File',
'./',
'(*.jpg)' # !!!
)
if res:
self.filename_2.setText(res)
if __name__ == "__main__":
app=QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec())
