我正在尝试在macOS上打包tkinter应用。但是,cx_freeze不包括所需的库文件夹。我无法使用用于macOS的官方Python安装程序包来构建任何应用程序,因此我决定编译自己的Python构建并将其与最新的tkinter链接。
我的设置:
自制Flash安装
brew install tcl-tk
Python环境
PYTHON_CONFIGURE_OPTS="--with-tcltk-includes='-I/usr/local/opt/tcl-tk/include' --with-tcltk-libs='-L/usr/local/opt/tcl-tk/lib -ltcl8.6 -ltk8.6'" MACOSX_DEPLOYMENT_TARGET=10.9 pyenv install 3.8.5
pyenv global 3.8.5
python --version
3.8.5
python -m pip install cx_freeze
python -m pip show cx_freeze
[...]Version: 6.2[...]
Python Tkinter脚本-app.py
import tkinter as tk
from tkinter import Frame
from os import path, remove, environ
import sys
class mainWindow(Frame):
def __init__(self):
Frame.__init__(self)
if __name__ == "__main__":
if getattr(sys, 'frozen', False):
WorkingDir = path.dirname(sys.executable)
if sys.platform == "darwin":
environ['TK_LIBRARY'] = WorkingDir + '/tk8.6/'
environ['TCL_LIBRARY'] = WorkingDir + '/tcl8.6/'
print(environ['TCL_LIBRARY'])
print(environ['TK_LIBRARY'])
else:
WorkingDir = path.dirname(path.realpath(__file__))
root = tk.Tk()
app = mainWindow()
root.mainloop()
cx_freeze-setup.py
import sys
from cx_Freeze import setup, Executable
# MacOS
bdist_mac_options = {'bundle_name': 'tkinter app'}
base = None
target = Executable(
script="app.py",
base=base,
targetName="app"
)
setup(name = "Tkinter Standalone App",
version = "0.1",
author = "Me",
description = "For Testing Purposes Only",
options = {"bdist_mac": bdist_mac_options},
executables = [target])
构建结果
python setup.py bdist_mac
您可以找到构建日志here。如您所见,它确实复制了正确的* .dylibs,但没有包括tkinter需要的任何其他文件。如果我注释掉以上条件设置TCL和TK_LIBRARY路径的情况,则使用open -a'tkinter app.app'或build /文件夹中的exectuable启动应用程序可以正常工作。但是,在卸载tcl-tk之后,我收到此消息:
brew uninstall tcl-tk
xcodeclub@XCodeClubs-Mac-4 MacOS % ./app
Traceback (most recent call last):
File "/Users/xcodeclub/.pyenv/versions/3.8.5/lib/python3.8/site-packages/cx_Freeze/initscripts/__startup__.py", line 40, in run
module.run()
File "/Users/xcodeclub/.pyenv/versions/3.8.5/lib/python3.8/site-packages/cx_Freeze/initscripts/Console.py", line 33, in run
exec(code, m.__dict__)
File "app.py", line 23, in <module>
File "/Users/xcodeclub/.pyenv/versions/3.8.5/lib/python3.8/tkinter/__init__.py", line 2261, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
/usr/local/Cellar/tcl-tk/8.6.10/lib/tcl8.6 /Users/xcodeclub/.pyenv/lib/tcl8.6 /Users/xcodeclub/lib/tcl8.6 /Users/xcodeclub/.pyenv/library /Users/xcodeclub/library /Users/xcodeclub/tcl8.6.10/library /Users/tcl8.6.10/library
This probably means that Tcl wasn't installed properly.
如果我将丢失的文件复制到可执行文件路径,则可以从“ tkinter app.app”文件夹启动二进制文件:
brew install tcl-tk
cp -r /usr/local/Cellar/tcl-tk/8.6.10/lib/tk8.6 tkinter\ app.app/Contents/MacOS/
cp -r /usr/local/Cellar/tcl-tk/8.6.10/lib/tcl8.6 tkinter\ app.app/Contents/MacOS/
brew uninstall tcl-tk
xcodeclub@XCodeClubs-Mac-4 MacOS % ./app
/Users/xcodeclub/Documents/tkinter-app/build/tkinter app.app/Contents/MacOS/tcl8.6/
/Users/xcodeclub/Documents/tkinter-app/build/tkinter app.app/Contents/MacOS/tk8.6/
但是,启动应用程序本身将导致应用程序快速打开然后关闭,而没有任何错误消息。有什么想法我想念的吗?我也曾经使用过cx-freeze的include_files和include_resources选项,但这也行不通。
我设法在Windows和Linux上成功构建了我的tkinter应用程序,但是几个月来一直困扰于此macOS问题。任何帮助将不胜感激!