使用cx_Freeze为Windows构建的python tkinter exe将不显示GUI

时间:2018-09-13 18:12:00

标签: python windows tkinter cmd cx-freeze

问题已解决。 问题出在jaraco模块上,该模块用于剪贴板操作,而我使用pyperclip。

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

使用cx_Freeze创建exe时,您可以指定基本参数,如果您不指定将打开2个窗口,cmd窗口和您的应用程序的GUI窗口的参数。要摆脱cmd窗口,可以将“ Win32GUI”指定为cx_Freeze的基本参数。

这将忽略cmd窗口,只是打开GUI,它似乎正在工作,但并非总是如此。 有时打开exe文件将启动该过程,但不会显示GUI。打开cmd并进入您的exe目录,然后从那里启动它实际上会显示GUI并解决问题,直到您重新启动计算机(您可以在不使用cmd的情况下打开该应用程序,直到重新启动为止)

似乎只要cmd窗口在您的内存中,GUI就会显示出来,否则它“不知道”并且无法显示GUI。

代码可在此处找到: 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"

谢谢!

1 个答案:

答案 0 :(得分:0)

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

尝试对您的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',
    ]}},