【问题标题】:python tkinter exe built with cx_Freeze for windows won't show GUI使用 cx_Freeze for windows 构建的 python tkinter exe 不会显示 GUI
【发布时间】:2019-02-18 12:49:19
【问题描述】:

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

谢谢!

【问题讨论】:

  • 请不要链接到其他网站上的代码。相反,请创建一个 minimal reproducible example 并将其直接包含在您的问题中。
  • @BryanOakley 我这样做是为了不让整个代码看起来很庞大,而且 github 是查看代码的好来源,我将在此处包含我的 setup.py,因为它更小。
  • 我们不想要“整个代码”。我们想要为这个问题创建一个小的minimal reproducible example。并且 github不是查看代码问题的好来源,因为您链接到的分支可能会随着时间的推移而更新或删除,从而使问题变得无用。

标签: python windows tkinter cmd cx-freeze


【解决方案1】:

查看代码库中的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',
    ]}},

【讨论】:

  • 是的,但在build 中,build 是构建目录。在我看来,它们应该放在build/lib
  • 我不太明白如何将它包含在 build/lib 位置,我尝试了以下方法:(os.path.join('lib', os.path.join(PYTHON_INSTALL_DIR, 'DLLs ', 'tk86t.dll'))) 而不是以前的,但它仍然把 dll 放到 build/
  • @hey 我编辑了我的答案来解释我会怎么做。
  • thx,我只是喜欢你的例子,重新启动了我的电脑,但它不起作用,我可以看到 GUI 出现了半秒钟,它消失了,但在进程中运行
  • 那么在您按照@BryanOakley 的建议提供Minimal, Complete, and Verifiable example 之前,我无法进一步帮助您,抱歉。
猜你喜欢
  • 1970-01-01
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
相关资源
最近更新 更多