python 使用 cx_Freeze 为 windows 构建的 tkinter exe 不会显示 GUI

python tkinter exe built with cx_Freeze for windows won't show GUI

问题已解决。 问题出在我用于剪贴板操作的 jaraco 模块,我改用了 pyperclip。

我用 tkinter 制作了一个 python 应用程序,运行良好,但我想从中制作一个 exe,以便它在 windows 中对用户友好。我为此使用了 cx_Freeze 库,它也可以正常工作,但并非总是如此。

当使用 cx_Freeze 创建 exe 时,您可以指定基本参数,如果您提供 none 将打开 2 windows、cmd window 和一个 GUI window 为您的应用程序。要摆脱 cmd window,您可以将 "Win32GUI" 指定为 cx_Freeze.

的基本参数

这将忽略 cmd window 并仅打开 GUI,它似乎可以正常工作,但并非总是如此。 有时打开 exe 文件会启动进程,但不会显示 GUI。打开 cmd 并转到你的 exe 目录并从那里启动它实际上会显示 GUI 并解决问题,直到你重新启动你的电脑(你可以在没有 cmd 的情况下打开应用程序,一切正常直到重新启动)

好像只要cmd window在你的ram里,GUI就会显示,否则"doesn't know"显示不出来

代码可以在这里找到: https://github.com/GrishaDev/ClipMagic

clip.py 是整个应用程序

setup.py 是与 cx_Freeze 一起用于获取应用程序 exe 的文件,这是您指定基本参数等的地方。

最有可能出现问题的代码段 (setup.py):

import sys
from cx_Freeze import setup, Executable
# import os
# os.environ['TCL_LIBRARY'] = "C:\Users\Grisha\AppData\Local\Programs\Python\Python35\tcl\tcl8.6"
# os.environ['TK_LIBRARY'] = "C:\Users\Grisha\AppData\Local\Programs\Python\Python35\tcl\tk8.6"
import os.path
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')

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

setup(name="clipmagic",
      version="1",
      description="Extended clipboard",
      options={'build_exe': {'includes': ["jaraco", "tkinter"], 'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
            'icon.ico',
         ]}},
      executables=[Executable("clip.py", base=base, icon='icon.ico')])

#"Win32GUI"

谢谢!

查看代码存储库中的 README.md,您使用的是 cx_Freeze 的当前版本,即 5.1.1。在此版本中,包含的模块位于构建目录的子目录 lib 中。手动添加的 DLL 显然也需要移动到那里。参见

尝试对您的 setup.py 脚本进行以下更改:

options={'build_exe': {'includes': ["jaraco", "tkinter"], 'include_files':[
    (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
    (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll')),
    'icon.ico',
    ]}},