首页 > 解决方案 > 使用 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 运行脚本没问题。我认为它仍然与环境有关,因为如果我删除代码顶部的行,它会再次工作......

标签: pythonqttraitscx-freezemayavi

解决方案


推荐阅读