在构建tkinter应用时,cx_freeze在macOS上不包含tcl8.6和tk8.6文件夹

时间:2020-07-24 13:15:36

标签: python macos tkinter cx-freeze

我正在尝试在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问题。任何帮助将不胜感激!

0 个答案:

没有答案