tkinter 程序使用 cx_Freeze 编译但程序不会启动
tkinter program compiles with cx_Freeze but program will not launch
我正在尝试按照本教程创建可执行文件
https://github.com/anthony-tuininga/cx_Freeze/tree/master/cx_Freeze/samples/Tkinter
经过一些调整后,我能够编译该项目,但是当我单击 .exe 时,鼠标加载动画会触发,但不会加载任何内容。这个问题以前有人问过,但一直没有解决。
Where to start looking in the code when your .exe doesn't work after cx_freeze?
我的应用文件
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title('Button')
print("something")
new = messagebox.showinfo("Title", "A tk messagebox")
root.mainloop()
我的setup.py
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
executables = [
Executable('SimpleTkApp.py', base=base)
]
setup(name='simple_Tkinter',
version='0.1',
description='Sample cx_Freeze Tkinter script',
executables= [Executable("SimpleTkApp.py", base=base)])
此外,我一直在手动添加 TCL/TK 库
set TK_LIBRARY=C:\...\tk8.6 etc
我的配置:python3.7,cx_Freeze5.1.1
任何帮助将不胜感激,我什至不知道从哪里开始。
我这里有一个工作 setup.py。也许您可以尝试使用相同的配置后看看它是否有效。基本上有时在编译后,tk 和 tcl dll/packages 会丢失,因此您需要在安装过程中包含它们。
import sys, os
from cx_Freeze import setup, Executable
includes = []
include_files = [r"C:\Users\user\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll",
r"C:\Users\user\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll"]
base = 'Win32GUI' if sys.platform == 'win32' else None
os.environ['TCL_LIBRARY'] = r'C:\Users\user\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\user\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6'
setup(name="simple_Tkinter",
version="0.1",
options={"build_exe":{"includes":[],"include_files":include_files}},
description="Sample cx_Freeze Tkinter script",
executables=[Executable("SimpleTkApp.py",base=base)])
尝试修改你setup.py
如下:
import sys
from cx_Freeze import setup, Executable
import os
PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
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')
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'))]
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
executables = [Executable('SimpleTkApp.py', base=base)]
setup(name='simple_Tkinter',
version='0.1',
description='Sample cx_Freeze Tkinter script',
options={'build_exe': {'include_files': include_files}},
executables=executables)
这应该适用于 cx_Freeze
版本 5.1.1(当前版本)。在此版本中,包含的模块位于构建目录的子目录 lib
中。如果您使用 5.0.1 或更早版本,请设置
include_files = [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll')]
相反。
另见 and
编辑:
另一个问题是 cx_Freeze
在 python 3.7 中有一个错误尚未纠正。请参阅 Cx_freeze crashing Python3.7.0。您可以找到一个 link 错误修复,您应该手动应用它(根据 OP,这解决了问题,请参阅评论)。
在尝试了一个更简单的 hello world 示例写入控制台(同样失败)后,我偶然发现了罪魁祸首。
使用找到的代码 here 更新我的 freezer.py 文件并使用 jpeg 提供的 setup.py 后,我的示例应用程序运行正常。感谢你们 swift 的回复。
我正在尝试按照本教程创建可执行文件
https://github.com/anthony-tuininga/cx_Freeze/tree/master/cx_Freeze/samples/Tkinter
经过一些调整后,我能够编译该项目,但是当我单击 .exe 时,鼠标加载动画会触发,但不会加载任何内容。这个问题以前有人问过,但一直没有解决。
Where to start looking in the code when your .exe doesn't work after cx_freeze?
我的应用文件
from tkinter import *
from tkinter import messagebox
root = Tk()
root.title('Button')
print("something")
new = messagebox.showinfo("Title", "A tk messagebox")
root.mainloop()
我的setup.py
import sys
from cx_Freeze import setup, Executable
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
executables = [
Executable('SimpleTkApp.py', base=base)
]
setup(name='simple_Tkinter',
version='0.1',
description='Sample cx_Freeze Tkinter script',
executables= [Executable("SimpleTkApp.py", base=base)])
此外,我一直在手动添加 TCL/TK 库
set TK_LIBRARY=C:\...\tk8.6 etc
我的配置:python3.7,cx_Freeze5.1.1
任何帮助将不胜感激,我什至不知道从哪里开始。
我这里有一个工作 setup.py。也许您可以尝试使用相同的配置后看看它是否有效。基本上有时在编译后,tk 和 tcl dll/packages 会丢失,因此您需要在安装过程中包含它们。
import sys, os
from cx_Freeze import setup, Executable
includes = []
include_files = [r"C:\Users\user\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll",
r"C:\Users\user\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll"]
base = 'Win32GUI' if sys.platform == 'win32' else None
os.environ['TCL_LIBRARY'] = r'C:\Users\user\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Users\user\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6'
setup(name="simple_Tkinter",
version="0.1",
options={"build_exe":{"includes":[],"include_files":include_files}},
description="Sample cx_Freeze Tkinter script",
executables=[Executable("SimpleTkApp.py",base=base)])
尝试修改你setup.py
如下:
import sys
from cx_Freeze import setup, Executable
import os
PYTHON_INSTALL_DIR = os.path.dirname(sys.executable)
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')
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'))]
base = None
if sys.platform == 'win32':
base = 'Win32GUI'
executables = [Executable('SimpleTkApp.py', base=base)]
setup(name='simple_Tkinter',
version='0.1',
description='Sample cx_Freeze Tkinter script',
options={'build_exe': {'include_files': include_files}},
executables=executables)
这应该适用于 cx_Freeze
版本 5.1.1(当前版本)。在此版本中,包含的模块位于构建目录的子目录 lib
中。如果您使用 5.0.1 或更早版本,请设置
include_files = [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll')]
相反。
另见
编辑:
另一个问题是 cx_Freeze
在 python 3.7 中有一个错误尚未纠正。请参阅 Cx_freeze crashing Python3.7.0。您可以找到一个 link 错误修复,您应该手动应用它(根据 OP,这解决了问题,请参阅评论)。
在尝试了一个更简单的 hello world 示例写入控制台(同样失败)后,我偶然发现了罪魁祸首。
使用找到的代码 here 更新我的 freezer.py 文件并使用 jpeg 提供的 setup.py 后,我的示例应用程序运行正常。感谢你们 swift 的回复。