2017-04-23 1196 views
0

我想在pyqt5中使用python3创建一个路径浏览器,但我有一些疑惑。我的代码是这样的:使用pyqt5库QFileDialog的Python错误

from PyQt5 import QtCore, QtGui, QtWidgets  
class Ui_MainWindow(object): 
     def setupUi(self, MainWindow): 
      MainWindow.setObjectName("MainWindow") 
      MainWindow.resize(800, 600) 
      self.centralwidget = QtWidgets.QWidget(MainWindow) 
      self.centralwidget.setObjectName("centralwidget") 
      self.horizontalLayoutWidget = QtWidgets.QWidget(self.centralwidget) 
      self.horizontalLayoutWidget.setGeometry(QtCore.QRect(300, 150, 160, 80)) 
      self.horizontalLayoutWidget.setObjectName("horizontalLayoutWidget") 
      self.horizontalLayout = QtWidgets.QHBoxLayout(self.horizontalLayoutWidget) 
      self.horizontalLayout.setObjectName("horizontalLayout") 
      self.label = QtWidgets.QLabel(self.horizontalLayoutWidget) 
      self.label.setObjectName("label") 
      self.horizontalLayout.addWidget(self.label) 
      self.lineEdit = QtWidgets.QLineEdit(self.horizontalLayoutWidget) 
      self.lineEdit.setObjectName("lineEdit") 
      self.horizontalLayout.addWidget(self.lineEdit) 
      self.toolButton = QtWidgets.QToolButton(self.horizontalLayoutWidget) 
      self.toolButton.setObjectName("toolButton") 
      self.horizontalLayout.addWidget(self.toolButton) 
      MainWindow.setCentralWidget(self.centralwidget) 

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


      QtCore.QMetaObject.connectSlotsByName(MainWindow) 

      # Button action 
      self.toolButton.pressed.connect(self.selectDirectory(MainWindow, self.lineEdit)) 
     def selectDirectory(self, MainWindow, editText): 

       editText.setText(str(QtWidgets.QFileDialog.getExistingDirectory(MainWindow, "Select Directory", str(editText.text())))) 

     def retranslateUi(self, MainWindow): 
      _translate = QtCore.QCoreApplication.translate 
      MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) 
      self.label.setText(_translate("MainWindow", "Path")) 
      self.toolButton.setText(_translate("MainWindow", "...")) 


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

的想法是使用的EditText写的文件夹的路径,但作为帮助我要介绍一个按钮,以选择目录打开文件浏览器。为了实现这一点,我试图使用QFileDialog没有成功。我现在的问题是当我运行我的应用程序时显示QFileDialog,当我选择一个文件夹时,应用程序崩溃。的第一件事,我不想没有按显示QFileDialog按钮,第二件事我不明白为什么应用程序与此错误崩溃:

Traceback (most recent call last): 
    File "test.py", line 48, in <module> 
    ui.setupUi(MainWindow) 
    File "test.py", line 31, in setupUi 
    self.toolButton.pressed.connect(self.selectDirectory(MainWindow, self.lineEdit)) 
TypeError: argument 1 has unexpected type 'NoneType' 

感谢您的帮助

回答

0

信号pressed希望连接到一个不需要参数的插槽,所以你不能直接连接selectDirectory()函数,你必须使用lambda函数建立连接。

您必须更改

self.toolButton.pressed.connect(self.selectDirectory(MainWindow, self.lineEdit)) 

self.toolButton.pressed.connect(lambda m=MainWindow, l=self.lineEdit: self.selectDirectory(m, l)) 
+0

谢谢!这是工作 – Dhorka