【发布时间】: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