Py2exe编译正常但生成的应用程序不工作

2 投票
2 回答
1848 浏览
提问于 2025-04-18 08:02

我正在使用 Python 2.7 来构建我的应用程序。在这个程序里,我用了几个包,分别是 numpyscipycsvsysxlwttimewxpythonoperator

以上这些包都是 64 位的,而我在 Windows 7 专业版(64 位)上使用的是 Aptana Studio 3(64 位版本)的 Python 2.7(64 位版本)。

最后,我想用以下代码把我的项目编译成一个应用程序,文件名是 py2exeTest.py

from distutils.core import setup
import numpy                  # numpy is imported to deal with missing .dll file

import py2exe

setup(console=["Graphical_Interface.py"])

然后在 cmd 中,我切换到项目的目录,并用以下命令进行编译:

python py2exeTest.py py2exe

一切都很顺利,它在 dist 目录下生成了一个应用程序,名字是 Graphical_Interface.exe

我双击它,但出现了一个 cmd 窗口,还有一个 Python 输出窗口闪了一下,然后这两个窗口都消失了。我尝试以管理员身份运行这个应用程序,结果还是一样。

请问我该怎么解决这个问题?

谢谢!

编辑:

我成功捕捉到了闪烁在屏幕上的错误信息。错误信息是:

Traceback (most recent call last):
  File "Graphical_Interface.py", line 397, in <module>
  File "Graphical_Interface.py", line 136, in __init__
  File "wx\_core.pyc", line 3369, in ConvertToBitmap
wx._core.PyAssertionError: C++ assertion "image.Ok()" failed at ..\..\src\msw\bitmap.cpp(802) in wxBitmap::CreateFromImage(): invalid image

我在项目中使用了一张 PNG 图片,代码如下:

self.workflow = wx.Image("Work Flow.png", wx.BITMAP_TYPE_ANY).ConvertToBitmap()
wx.StaticBitmap(self.panel_settings, -1, self.workflow, (330,270), (self.workflow.GetWidth(), self.workflow.GetHeight()))

我尝试把上面的代码注释掉,应用程序就能正常工作了。但是,我需要在应用程序中显示这张图片。

请问我该怎么处理这个问题?

谢谢。

2 个回答

0

别担心,我有办法解决这个问题。

原来这个图片是在项目文件夹里,而不是在 dist 文件夹里。所以我有两个解决办法:

  1. 把图片复制到 dist 文件夹里。

  2. 在代码里写上图片的完整路径。

谢谢你的帮助。

2

在编译图形应用程序时,你不能把它们做成控制台应用,因为有一些原因(老实说,我也说不清楚具体是什么),但你可以试试这个:

from distutils.core import setup
import numpy
import py2exe
import wxpython
setup(window=['Graphical_Interface.py'],
      options={"py2exe" { 'boundle_files' : 1}})

另外,你也可以考虑换成:

这个工具支持Python3,并且可以在多个平台上使用。
一个cx_freeze脚本大概会长这样:

import sys
from cx_Freeze import setup, Executable

# Dependencies are automatically detected, but it might need fine tuning.
build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}

# GUI applications require a different base on Windows (the default is for a
# console application).
base = None
if sys.platform == "win32":
    base = "Win32GUI"

includefiles = ['/folder/image.png']

setup(  name = "GUIprog",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options, 'include_files' : includefiles},
        executables = [Executable("Graphical_Interface.py", base=base)])

撰写回答