Pyinstaller 的 PyQT5 QFileDialog 问题

Posted

技术标签:

【中文标题】Pyinstaller 的 PyQT5 QFileDialog 问题【英文标题】:PyQT5 QFileDialog issues with Pyinstaller 【发布时间】:2020-02-15 11:40:01 【问题描述】:

我在 Arch Linux 上使用 PyQt5 和 Pycharm 和 Python 3.7(也尝试使用 3.8)。当我从 PyCharm 或直接从命令行运行我的代码时,文件对话框打开得很好。但是,当我使用 Pyinstaller 构建时,我会在使用它们时遇到一致的错误。代码:

def choose_log_location(self):
    self.log_location = QFileDialog.getExistingDirectory(
        self,
        "Choose Log Files Directory",
        "/home",
        options=QFileDialog.ShowDirsOnly)

    if self.log_location != "":
        self.Log_Location.setText(self.log_location)

使用 Pyinstaller 构建后,运行构建的应用程序并单击触发此方法的按钮,我会弹出 3 个错误对话框:

    错误?网址不能列出 file:/// 网址格式错误 错误?网址不能列出 file:///

然后,一旦文件对话框真正弹出,主要区域是空白的。

我还在控制台中收到以下错误:

kf5.kio.core: "" qt.qpa.xcb:QXcbConnection:XCB 错误:3(BadWindow),序列:7952, 资源ID:36398251,主要代码:40(TranslateCoords),次要代码:0

使用 QFileDialog.getOpenFileName() 时我也遇到了一些类似的问题(文件应该是空白区域 - 注意没有过滤器测试,结果相同)但控制台中出现不同的错误:

kf5.kservice.services: KServiceTypeTrader: serviceType "ThumbCreator" 未找到

【问题讨论】:

您是否在 Windows 上运行可执行文件?您是否尝试将路径设置为环境中存在的路径(或只是一个空路径)? 不,在 Linux 上构建和运行。解决方法是使用我发现的 DontUseNativeDialog 选项和其他一些选项。但是,很遗憾原生版本无法正常运行。 也许 PyInstaller 改变了环境中的某些东西,使对话框无法显示内容。您是否确认即使使用空路径它也不起作用?您是否尝试过基于 QUrl 的静态(getExistingDirectoryUrl)?我在 pyinstaller 邮件列表中找到了reference:«Qt 需要其他一些共享库才能访问“本机文件对话框”»。但我相信它可能与 QT_QPA_PLATFORMTHEME 或 XDG_CURRENT_DESKTOP 有关。从代码和构建运行时,您可以检查这些变量的输出吗? 【参考方案1】:

我遇到了同样的问题。 似乎 pyinstaller 使用本机对话框产生此错误。 所以我的解决方案是使用DontUseNativeDialog 选项。

例如

self.log_location = QFileDialog.getExistingDirectory(
        self,
        "Choose Log Files Directory",
        "/home",
        QFileDialog.DontUseNativeDialog)

【讨论】:

以上是关于Pyinstaller 的 PyQT5 QFileDialog 问题的主要内容,如果未能解决你的问题,请参考以下文章

pyinstaller 打包pyqt5 报错

pyinstaller + pyqt5:找不到或加载“可可”

Pyinstaller 的 PyQT5 QFileDialog 问题

Pyinstaller 和 PyQt5 出错“找不到现有的 PyQt5 插件目录”

PyQt5总结--打包pyinstaller

pyinstaller 不适用于 pyqt5 和 matplotlib