使用cx_Freeze将GUI应用程序转换为.exe文件:找不到用于工具包qt4的插件

时间:2018-10-12 08:46:28

标签: python qt traits cx-freeze mayavi

我的程序包含mayavi,traits和pyqt5元素,以便可视化3D。 我尝试使用cx_Freeze转换我的GUI应用程序,并创建了exe文件,但是运行它时出现错误:

no traitsui.toolkits plugin found for toolkit qt4

经过Google和stackoverflow的研究,我发现它可能与我的环境有关: 参见creating standalone exe using pyinstaller with mayavi import

根据Google进一步研究的建议,我在代码顶部添加了以下几行:

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可以运行。我认为这仍然与环境有关,因为如果删除代码顶部的行,它将再次起作用...

0 个答案:

没有答案