使用 cx_freeze 冻结 py 脚本时的问题

Posted

技术标签:

【中文标题】使用 cx_freeze 冻结 py 脚本时的问题【英文标题】:Issue when freezing a py script with cx_freeze 【发布时间】:2016-04-18 09:02:49 【问题描述】:

我刚刚在 Python 中进行了编码,并想使用 cx freeze 创建一个独立的 .exe,但我遇到了 tkinter 的问题。我能够生成一个非常简单的窗口,但是当我添加 tkinter 时,它不再工作了。

这是我的代码:

tkinter2.py:

    #!/usr/bin/env python
    # -*-coding:Latin-1 -*


    import tkinter 

    base = None

    if sys.platform  == 'win32':
        base="Win32GUI"

    TK=Tk()

    # Function called when user hit the keyboard
    def clavier(event):
        global coords

        touche = event.keysym

        if touche == "Up":
            coords = (coords[0], coords[1] - 10)
        elif touche == "Down":
            coords = (coords[0], coords[1] + 10)
        elif touche == "Right":
            coords = (coords[0] + 10, coords[1])
        elif touche == "Left":
            coords = (coords[0] -10, coords[1])
        # change of coordinates for the rectangle
        canvas.coords(rectangle, coords[0], coords[1], coords[0]+25, coords[1]+25)

    # canvas creation
    canvas = Canvas(TK, width=250, height=250, bg="ivory")
    # initial coord
    coords = (0, 0)
    #rectangle creation
    rectangle = canvas.create_rectangle(0,0,25,25,fill="violet")
    canvas.focus_set()
    canvas.bind("<Key>", clavier)
    # canvas creation
    canvas.pack()

然后在 cmd 中,这就是我所做的: 我去 C:\Python34 并点击 python.exe "Scripts\cxfreeze" "Scripts\tkinter2.py" 它似乎可以编译,但说缺少一些似乎是 tkinter 的模块。如果我启动创建的 .exe,我有“ImportError: no module name 'Tkinter'”。 我使用的是 Python 3.4,并且已经安装了相应的 cx_freeze。

你知道我为什么会出现这样的错误吗?是不是因为 tkinter 的某些底层组件在冻结我的 py 脚本时无法使用?

谢谢, 钉钉

【问题讨论】:

【参考方案1】:

通常在使用 CX_Freeze 时,您将创建一个 setup.py 文件(您可以将其重命名为您想要的任何名称)。然后构建你通常会做'python setup.py build'(这是在命令提示符下,你会 cd 到 setup.py 和 tkinter2.py 文件存储的目录)。 Tk 无法使用 cx freeze 构建的最常见原因是您缺少 DLL 文件。使用以下代码制作 setup.py 并尝试一下:

import sys
import cx_Freeze
import os.path


base = None

if sys.platform == 'win32':
    base = "Win32GUI"


PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')

executables = [cx_Freeze.Executable("tkinter2.py", base=base)]


options = 
    'build_exe': 

        'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),


         ],
    ,



cx_Freeze.setup(
    name = "Stack Overflow Q",
    options = options,
    version = "1.0",
    description = 'Stack Overflow Q',
    executables = executables
)

编辑:我还注意到您的程序末尾没有 TK.mainloop()

【讨论】:

以上是关于使用 cx_freeze 冻结 py 脚本时的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 cx_Freeze 冻结时不显示主窗口图标

将 CX_Freeze 与 Scipy 一起使用:scipy.special._ufuncs.py

使用 cx_Freeze 冻结 Python 3.7 脚本时如何修复错误

PYQT资源,冻结程序

由于 mpl_toolkits,cx_Freeze 无法冻结脚本

ImportError:运行我的应用程序时没有名为“队列”的模块被 cx_freeze 冻结