Не работает QFileDialog

Не могу сделать чтобы при нажатии кнопки "Select" открывался проводник для выбора файла.

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QFileDialog


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(331, 167)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.selectbtn = QtWidgets.QPushButton(self.centralwidget)
        self.selectbtn.setGeometry(QtCore.QRect(90, 10, 151, 51))
        self.selectbtn.setObjectName("selectbtn")
        self.playbtn = QtWidgets.QPushButton(self.centralwidget)
        self.playbtn.setGeometry(QtCore.QRect(130, 60, 75, 23))
        self.playbtn.setObjectName("playbtn")
        MainWindow.setCentralWidget(self.centralwidget)
        self.btnfunc()
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.selectbtn.setText(_translate("MainWindow", "Select"))
        self.playbtn.setText(_translate("MainWindow", "Play"))

    def btnfunc(self):
        self.selectbtn.clicked.connect(self.selectfunc)
    def selectfunc(self):
        res = QFileDialog(self, 'Open File', f'D:\DOWNLOADSBROWSER', 'MP3 file (*.mp3)')
        print(res)
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_())

Ответы (1 шт):

Автор решения: S. Nick

НИКОГДА НЕ ИЗМЕНЯЙТЕ код, сгенерированный Qt Designer, НИКОГДА.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.

QFileDialog::getOpenFileName() - удобная статическая функция, которая возвращает существующий файл, выбранный пользователем. Если пользователь нажимает Cancel, возвращается пустая строка.

from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(331, 167)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.selectbtn = QtWidgets.QPushButton(self.centralwidget)
        self.selectbtn.setGeometry(QtCore.QRect(90, 10, 151, 51))
        self.selectbtn.setObjectName("selectbtn")
        self.playbtn = QtWidgets.QPushButton(self.centralwidget)
        self.playbtn.setGeometry(QtCore.QRect(130, 60, 75, 23))
        self.playbtn.setObjectName("playbtn")
        MainWindow.setCentralWidget(self.centralwidget)
        
#        self.btnfunc()

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

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.selectbtn.setText(_translate("MainWindow", "Select"))
        self.playbtn.setText(_translate("MainWindow", "Play"))


class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        
        self.setupUi(self)

        self.selectbtn.clicked.connect(self.selectfunc)
        
    def selectfunc(self):
# ---------> v <---------------------> vvvvvvvvvvvvvvv <---------------------
        res, _ = QtWidgets.QFileDialog.getOpenFileName(
            self, 
            'Open File', 
            f'D:\DOWNLOADSBROWSER', 
            'MP3 file (*.mp3)'
        )
        print(res)
        
        
        
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)

    w = MainWindow()                                                  # +++
    w.show()                                                          # +++
    
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка