PyQt5 应用程序在 QFileDialog 关闭时关闭

PyQt5 Application shutting down when QFileDialog is closed

代码:

def open_file(self):
    filename = QFileDialog.getOpenFileName(self, 'Open File', expanduser("~"))
    try:
        with open(filename[0], 'r') as f:
            text = f.read()
            self.path = filename[0]
            self.textEdit.setPlainText(text)
            self.setWindowTitle(f'{filename[0]} - QtNotepad')

    except Exception as e:
        error = QDialog(str(e))
        error.show()
        pass

如果我选择使用右上角的 X 或关闭按钮关闭文件对话框,应用程序将关闭。我不知道我做错了什么。

一个取消的文件对话框returns一个空字符串作为第一个参数;由于 open() 需要一个有效的文件路径或对象,它会引发一个 FileNotFoundError 异常,因为 '' 显然不是一个有效的文件路径。

在例外情况下,您使用字符串作为 QDialog() 构造函数的参数,这是错误的,因为与大多数小部件一样,它只能接受 QWidget 作为第一个位置参数(仅严格 基于文本的小部件接受字符串)。

处理取消的文件对话框静态方法的正确方法是检查路径参数是否为空。然后,如果文件 does 存在但你想在 open 块中发生任何错误时显示错误消息,你应该使用 QMessageBox 代替,因为基本的 QDialog 是实际上是一个空的小部件。

def open_file(self):
    filename, _ = QFileDialog.getOpenFileName(self, 'Open File', expanduser("~"))
    if not filename:
        return
    try:
        with open(filename, 'r') as f:
            text = f.read()
            self.path = filename
            self.textEdit.setPlainText(text)
            self.setWindowTitle(f'{filename} - QtNotepad')

    except Exception as e:
        QMessageBox.warning(self, 'Error', 
            f'The following error occurred:\n{type(e)}: {e}')
        return

每当你遇到崩溃时,你必须尝试在终端或提示中 运行 你的脚本(使用 IDE 并不总是足够的)这样你就可以获得完整的回溯错误可能会解释程序崩溃的原因。
此外,在异常处理程序的开头添加异常的打印语句将帮助您了解这些异常的原因。