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',
]}},
问题已解决。 问题出在我用于剪贴板操作的 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',
]}},