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 QFileDialog 问题