2017-05-19 2 views
2

C'est la première fois que je tente de créer une interface graphique. J'ai créé un programme simple avec un bouton qui est censé ouvrir le navigateur de fichiers et retourner ce fichier. Je sais que PyQt5 a des commandes de dialogue de fichier intégrées, mais elles ne fonctionnent pas pour moi. J'ai essayé d'utiliser le tutoriel trouvé sur https://pythonspot.com/en/pyqt5-file-dialog/. J'ai également essayé plusieurs autres approches en ligne. Je ne peux pas penser à une raison pour laquelle cela ne fonctionne pas.La boîte de dialogue de fichier ne fonctionne pas avec PyQt5?

import sys, os 
from PyQt5.QtWidgets import QMainWindow, QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog 
from PyQt5 import QtCore, QtGui, QtWidgets 
from PyQt5.QtGui import QIcon 


class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName("Form") 
     Form.resize(1082, 800) 
     self.horizontalLayout_2 = QtWidgets.QHBoxLayout(Form) 
     self.horizontalLayout_2.setObjectName("horizontalLayout_2") 
     self.horizontalLayout = QtWidgets.QHBoxLayout() 
     self.horizontalLayout.setObjectName("horizontalLayout") 
     self.pushButton = QtWidgets.QPushButton(Form) 
     self.pushButton.setObjectName("pushButton") 
     self.horizontalLayout.addWidget(self.pushButton) 
     self.horizontalLayout_2.addLayout(self.horizontalLayout) 

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

     self.pushButton.clicked.connect(self.openFile) 


    def retranslateUi(self, Form): 
     _translate = QtCore.QCoreApplication.translate 
     Form.setWindowTitle(_translate("Form", "Form")) 
     self.pushButton.setText(_translate("Form", "PushButton")) 


    # FUNCTION BELOW NOT WORKING 
    def openFile(self): 
    options = QFileDialog.Options() 
    options |= QFileDialog.DontUseNativeDialog 
    fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Python Files (*.py)", options=options) 
    if fileName: 
     print(fileName) 


if __name__ == "__main__": 
    import sys 
    app = QtWidgets.QApplication(sys.argv) 
    Form = QtWidgets.QWidget() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 

Répondre

2

getOpenFileName nécessite comme paramètre un objet de type QWidget, dans votre cas Ui_Form n'est pas de ce type.

  • Première solution: pass None:

fileName, _ = QFileDialog.getOpenFileName(None,"QFileDialog.getOpenFileName()", "","All Files (*);;Python Files (*.py)", options=options) 
  • Deuxième solution: créer une classe qui implémente le visa Ui_Form, et il la fente openFile est créée .

class Widget(QtWidgets.QWidget, Ui_Form): 
    def __init__(self, parent=None): 
     QtWidgets.QWidget.__init__(self, parent) 
     self.setupUi(self) 
     self.pushButton.clicked.connect(self.openFile) 

    def openFile(self): 
     options = QFileDialog.Options() 
     options |= QFileDialog.DontUseNativeDialog 
     fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Python Files (*.py)", options=options) 
     if fileName: 
      print(fileName) 
+0

fonctionne parfaitement. –

+0

J'ai également trouvé une autre solution (que j'ai posté ci-dessous). Quelle est la différence de fonctionnalité entre les deux solutions? –

+0

@ J.Doe que s'est-il passé? – eyllanesc

1

Vous devez passer un QWidget comme parent. J'ai modifié votre code pour enregistrer le Form et l'utiliser plus tard.

class Ui_Form(object): 
    def setupUi(self, Form): 
     self.Form = Form   # <----- 
     ... 

    def openFile(self): 
     fileName, _ = QFileDialog.getOpenFileName(self.Form, # <----- 
     ... 
0

Une autre solution que j'ai trouvé de changer la fonction:

def openFileNameDialog(self):  
    fname = QFileDialog.getOpenFileName() 
    self.ui.lineEdit.setText(fname)