python - 使用 cx_Freeze 将 GUI 应用程序转换为 .exe 文件:找不到工具包 qt4 的插件
问题描述
我的程序包含 mayavi、traits 和 pyqt5 元素,以便在 3D 中可视化某些东西。我尝试使用 cx_Freeze 转换我的 GUI 应用程序并创建了 exe 文件,但运行它时出现错误:
no traitsui.toolkits plugin found for toolkit qt4
经过一些 google 和 stackoverflow 研究后,我发现它可能与我的环境有关:请参阅使用带有 mayavi 导入的 pyinstaller 创建独立 exe
根据进一步谷歌研究的建议,我将这些行添加到我的代码顶部:
import imp
try:
imp.find_module('pyside') # test if PySide if available
except ImportError:
os.environ['QT_API'] = 'pyqt' # signal to pyface that PyQt4 should be used
在 stackoverflow-thread 中讨论之后,我最终下载了“Jannick”的可执行文件。然后我删除了代码中负责将 mayavi 场景添加到 GUI 的行(用于测试目的):
self.ui = Visualization().edit_traits(parent=self,
kind='subpanel').control
Visualization() 是我使用 mayavi 进行实际可视化的类......然后我执行了 cx_Freeze,我的 setup.py 是:
import sys
import os
os.environ['TCL_LIBRARY'] = "C:\\Users\\Albo\Anaconda3\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\Users\\Albo\Anaconda3\\tcl\\tk8.6"
from cx_Freeze import setup, Executable
import cx_Freeze.hooks
build_exe_options = {"packages": ['pygments.lexers', 'tvtk.pyface.ui.qt4','pkg_resources._vendor',
'mayavi', 'traits', 'traitsui', 'sip',
'traitlets','tvtk.vtk_module','traits.api','traitsui.api','os','gui','gui.gui_mayavi', 'tvtk.vtk_module',
'pyface.qt','pyface.qt.QtGui','pyface.qt.QtCore','numpy'],
"includes":['gui','gui.gui_mayavi','mayavi','PyQt5'],
}
executables = [
Executable('main.py', targetName='main.exe',base = 'Win32GUI',)
]
setup(name='main',
version='1.0',
description='',
executables=executables,
options={"build_exe":build_exe_options},
)
现在我遇到了一个新错误,即:
RuntimeError: No pyface.toolkits plugin found for toolkit qt4
现在发生了一些奇怪的事情......我从“Jannick”的项目中复制了 pyface 文件夹并在我的构建中替换(它是从 cx_Freeze 创建的)。我的 exe 文件运行没有任何问题!我很高兴,我想好吧,我只需再次添加用于可视化的行,然后再次复制 pyface 文件夹,它就会运行。但是现在我又遇到了一个我根本无法理解的错误:
File "C:\Users\xxx\Desktop\xxx\xxx\xxx.py", line 300, in initUI
rightlayout.addWidget(self.ui)
TypeError: addWidget(self, QWidget, stretch: int = 0, alignment: Union[Qt.Alignment, Qt.AlignmentFlag] = Qt.Alignment()): argument 1 has unexpected type 'PySide.QtGui.QWidget'
我还意识到我无法从控制台运行脚本,但从 spyder 运行脚本没问题。我认为它仍然与环境有关,因为如果我删除代码顶部的行,它会再次工作......
解决方案
推荐阅读
- gcc - 无法打开源文件“begin_code.h”(“SDL2/SDL.h”的依赖项)
- node.js - 使用节点 express 的 express 验证器生成的错误
- asp.net-core - User.IsInRole 在每个用户切换到一个角色后返回 false
- javascript - Google Apps 脚本中的 Classroom API IndividualStudentsOptions
- java - 如何使用 Paths.of 解决此错误?
- bash - 在 bash 脚本中交叉使用 yml 变量
- node.js - react 应该在带有 node.js 的车把上使用吗?
- swift - 如何将导航按钮添加到 SwiftUI 应用程序?
- pandas - 不同大小的分层抽样
- go - 如何检查 gRPC 端点返回的值?