使用简单的PyQT界面选择目录路径时出现崩溃问题

3
我是一名有用的助手,可以翻译文本。

我对Python和PyQT都比较新。我使用PyQT5创建了一个非常简单的GUI界面。现在,我想将它升级为涉及更真实的内容,而不仅仅是计算数字操作。

我希望用户选择一个包含图像的目录。之后,进行一些其他小操作,如勾选某些复选框,我想在后台运行我的算法,并同时通过进度条向他/她显示进度。

这是我现在的代码:

import sys
from os.path import expanduser

from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5 import uic, QtGui

Ui_MainWindow, QtBaseClass = uic.loadUiType("mainGui_3A.ui")


class MyApp(QMainWindow):
    def __init__(self):
        super(MyApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.pushButton_Directory.clicked.connect(self.choose_directory)
        self.ui.pushButton_CreateAlbum.clicked.connect(self.create_album)

    def choose_directory(self):
        my_dir = QtGui.QFileDialog.getExistingDirectory(
        self,
        "Open a folder",
        expanduser("~"),
        QtGui.QFileDialog.ShowDirsOnly
    )
        self.ui.lineEdit_Directory.setText(my_dir)

    def create_album(self):
        current_dir = self.ui.lineEdit_Directory.toPlainText()
        check1 = self.ui.checkBox_1.value()
        check2 = self.ui.checkBox_2.value()
        return current_dir, check1, check2

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

我看了以下内容: PYQT - 如何打开目录文件夹? PyQt:QFileDialog.getExistingDirectory使用默认目录,独立于用户 正如您所见,自从出现下面的错误以来,我仍然没有添加最后一部分,但我认为我需要研究: 在PyQt中正确使用QThread的示例? 从与我的GUI类不同的类更改进度条的值PyQt4 起初没有错误。我相信UI已经正确加载,但是只要我点击其中一个按钮,程序就停止运行了...我做错了什么?我需要使用线程来选择目录吗?
欢迎提供未来的任何提示!

提前感谢!


它停止运行是什么意思?它已经存在了吗?除了(我希望)无效的格式 - create_album 应该是 MyApp 类的一个方法,我没有看到任何明显的错误。 - Radosław Cybulski
1
当我点击任何一个按钮时,我会收到已知消息,它的标题是“Python已停止工作”(来自Windows),然后我被建议关闭程序...但是当我点击复选框时,这种情况不会发生。你是对的,create_album是类中的一个方法 - 格式错误。 - Daniel Glazer
修正上述提到的格式问题。 - Daniel Glazer
我建议不要使用线程——对于选择目录来说肯定是不必要的,而且虽然非常强大,但学习曲线陡峭。你是从命令提示符还是IDE运行程序?有任何异常消息吗? - Joe P
请通过IDE(PyCharm)返回翻译后的文本,而不是通过cmd。我得到的只有:'Process finished with exit code -1073740791 (0xC0000409)',没有例外。 - Daniel Glazer
1个回答

7

我不太喜欢自问自答的想法,但如果这能帮助某人节省几个小时的研究时间,我认为这是可以接受的。

下面是我的解决方案和可能出现在代码中的错误。

解决方案:

import sys
from os.path import expanduser

from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog
from PyQt5 import uic, QtGui, QtCore

Ui_MainWindow, QtBaseClass = uic.loadUiType("mainGui_3A.ui")


class MyApp(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super(MyApp, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        logo_src = "appLogo.png"
        self.setWindowIcon(QtGui.QIcon(logo_src))
        self.ui.pushButton_Directory.clicked.connect(self.choose_directory)
        self.ui.pushButton_CreateAlbum.clicked.connect(self.create_album)
        self.ui.pushButton_Directory.setToolTip('Choose directory')
        self.ui.checkBox_Quality.setToolTip('Include image quality assessment upon selection of representative photos')
        self.ui.checkBox_Launch.setToolTip('Display output album when done')

    def choose_directory(self):
        print("Hello1")
        input_dir = QFileDialog.getExistingDirectory(None, 'Select a folder:', expanduser("~"))
        self.ui.lineEdit_Directory.setText(input_dir)




    def create_album(self):
        print("Hello2")
        current_dir = self.ui.lineEdit_Directory.text()
        if current_dir != "":
            quality = self.ui.checkBox_Quality.isChecked()
            launch = self.ui.checkBox_Launch.isChecked()
            print(current_dir)
            print(quality)
            print(launch)
        return 1


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyApp()
    window.show()
    sys.exit(app.exec_())

我通过文本比较找到的可能错误:

  • Using

    my_dir = QtGui.QFileDialog.getExistingDirectory(
        self,
        "Open a folder",
        expanduser("~"),
        QtGui.QFileDialog.ShowDirsOnly
    )
    

替代

    input_dir = QFileDialog.getExistingDirectory(None, 'Select a folder:', 
        expanduser("~"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接