我应该如何在 Windows 上启动可移植的 Python Tkinter 应用程序而不显得丑陋?
我使用 Tkinter 在 python 中编写了一个简单的 GUI 程序。我们将此程序称为“gui.py”。我的用户使用 Portable Python 在 Windows 计算机上通过 USB 密钥运行“gui.py”;在主机上安装任何东西都是不可取的。
我希望我的用户通过双击 USB 密钥根目录下的图标来运行“gui.py”。我的用户不关心 python 是什么,如果不需要,他们也不想使用命令提示符。我不希望他们关心 USB 密钥分配的驱动器号。我希望它可以在 XP、Vista 和 7 上运行。
我的第一个丑陋的解决方案是在 USB 密钥的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为“(root) \App\pythonw.exe (root)\App\gui.py",但我无法弄清楚如何在 Windows 快捷方式中执行相对路径,并且使用像“E:”这样的绝对路径似乎很脆弱。
我的下一个解决方案是在 USB 密钥的根目录中创建一个 .bat 脚本,如下所示:
@echo off
set basepath=%~dp0
"%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
这似乎并不关心 USB 密钥分配的驱动器号,但它确实在我的程序时使 DOS 窗口保持打开状态运行。实用,但丑陋。
接下来我尝试了这样的 .bat 脚本:(
@echo off
set basepath=%~dp0
start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
参见 这里解释了有趣的引用)
现在,在我的 GUI 打开之前,DOS 窗口在屏幕上短暂闪烁。少一点丑!还是丑啊
真正的男人如何处理这个问题呢?从 USB 记忆棒在 Windows 机器上启动 python Tkinter GUI 的最不丑陋的方法是什么?
编辑: 下面的所有答案都非常好(py2exe、pyinstaller、小.exe、.wsf 脚本。).wsf 解决方案是最简单的,所以我现在使用它。如果我想要更漂亮的图标和标准的 .exe 扩展名,我可能最终会切换到其他三种解决方案之一。谢谢大家!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

发布评论
评论(7)
使用 pyinstaller 来压缩你的发行版(相对于 py2exe 的优点是它知道
不同的版本)第三方库并且通常是最新的)。
然后,您可以创建一个 .exe 供用户单击以启动您的应用程序。如果您只是将 pyinstaller 构建的结果复制到 USB 驱动器上,应该没问题。
简短回答:
这个问题是几年前提出的,但我最近为我正在开发的一个程序找到了一个解决方案,该解决方案可能对其他人仍然有用。通过这种方法,您将能够创建一个独立的 exe 程序启动器,它可以放置在任何地方并引用同一文件夹或子目录中的文件,同时具有您选择的漂亮图标并且不会弹出 DOS 屏幕。换句话说,一个真正好看的相对路径可传输快捷方式文件:)
即使对于非程序员来说,该解决方案也应该易于遵循和执行,如下所示:
- 打开记事本
- 写入:%windir%\system32\cmd.exe / c 开始 "" "%CD%\可选
subfolder\mainpy2exeGUI.exe” - 另存为“whatever.bat”
- 使用名为“BAT to EXE converter”的程序将bat文件转换为exe文件
勾选“隐藏应用程序”选项,然后选择
您想要的图标文件位于“版本信息”选项卡下。你可以命名
输出的exe文件可以是你想要的任何文件。转换器链接
程序可以在以下位置找到:
http: //www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/
转换器程序下载包含 32 位和 64 位版本,使用 32 位版本使旧版和新版 PC 都可以使用该快捷方式。
(请注意,此解决方案与 http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/然而,当前的解决方案在步骤 2 中使用的代码方面有所不同,它允许启动程序放置在计算机上的任何位置,而不仅仅是 USB 记忆棒的顶部目录,并且新强调了不可见选项。应该检查这些差异。)
更多详细信息(可选):
最初的问题是:“从 USB 记忆棒在 Windows 计算机上启动 python Tkinter GUI 的最不丑陋的方法是什么?”
需要什么可以分为四件事:
1. exe程序启动器。
2. 适用于任何计算机和任何目录(即支持相对路径)。
3. 有一个图标。
4. 这不会打开“丑陋的”DOS 窗口。
建议了几种可能的解决方案,但到目前为止还没有一个能够满足所有标准。最初的海报选择了“.wsf”选项,该选项允许相对路径并且没有丑陋的 DOS 窗口,但不允许自定义图标或可识别的 exe 文件。
先前建议的解决方案的部分问题包括:
- 您没有 C/VB 编程技能或软件。
- 您想要启动程序的图标。使用执行“cmd”并使用它打开 GUI 文件的快捷方式文件将允许您设置图标文件,但图标文件引用是绝对的,并且在除您创建快捷方式文件的计算机之外的任何其他计算机上都会失败。
- 你不想要“丑陋”的 DOS 窗口闪烁。上一点提到的 cmd 快捷方式解决方案会创建一个 DOS 窗口,该窗口在打开 GUI 之前会闪烁。
- 将 py2exe 主可执行文件作为程序启动器几乎是一个完美的解决方案,因为它满足所有标准,但它的缺点是 py2exe 可执行文件需要将一个丑陋的“tlc”文件夹放置在同一顶级目录中。因此,最好将主 py2exe 启动器隐藏在一个命名良好的子文件夹中。此外,在很多情况下,人们希望将程序启动器和程序本身保留为单独的 exe 文件,例如,如果您仅使用主 py2exe 程序作为 python 运行程序运行,可以启动开放式可编辑 python您可以随时编辑这些脚本,而无需在每次更改脚本之一时创建新的 py2exe 文件。
您还可以分叉 GitHub 上的可移植 Python 源,并以创建其他可移植 Python 快捷方式的方式创建快捷方式。
这为您提供了启动应用程序、图标的好方法,如果需要,您可以设置自定义注册表/环境变量等。
作为示例,您可以使用 "="" rel="nofollow">可移植的 Python 源代码。
我制作了一个批处理脚本(PyRunEXE),它编译一个简单的汇编语言代码来为您制作一个 EXE 启动器:
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
可以使用此 Windows Scripting Host 脚本(文件扩展名 .wsf)代替批处理文件:
更新:或者编译此 C 程序并链接图标资源:
更新 2:要构建带有图标的 App.exe,请将 C 代码保存到app.c,创建 Windows 图标文件 app.ico,并将以下行保存到 app.rc:
使用 Visual Studio 2008 Express,运行以下命令:
或者使用“Visual Studio 2010 Express”或“Microsoft Windows SDK v7.0 for Windows 7 和 .NET Framework 3.5 Service Pack 1”并相应地调整命令。
请注意,该图标仅用于 App.exe 启动程序,而不用于您的 Python 程序。
This Windows Scripting Host script (file extension .wsf) can be used instead of the batch file:
Update: Alternatively compile this C program and link an icon resource:
Update 2: To build an App.exe with icon, save the C code to app.c, create an Windows icon file app.ico, and save the following line to app.rc:
Using Visual Studio 2008 Express, run these commands:
Alternatively use "Visual Studio 2010 Express" or "Microsoft Windows SDK v7.0 for Windows 7 and .NET Framework 3.5 Service Pack 1" and adjust the commands accordingly.
Note that the icon will only be used for the App.exe starter program, not your Python program.