我使用 Tkinter 在 Python 中编写了一个简单的 GUI 程序。我们称这个程序为“gui.py”。我的用户使用 Portable Python 从 USB key 在 Windows 机器上运行“gui.py” ;在主机上安装任何东西都是不可取的。
我希望我的用户通过双击 USB key 根部的图标来运行“gui.py”。我的用户不关心 python 是什么,如果不需要,他们也不想使用命令提示符。我不希望他们必须关心 USB key 分配的驱动器号。我希望它能在 XP、Vista 和 7 上运行。
我的第一个丑陋的解决方案是在 USB key 的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为类似“(root)\App\pythonw.exe (root)\App\gui.py”,但我不知道如何在 Windows 快捷方式中使用相对路径,使用像“E:”这样的绝对路径似乎很脆弱。
我的下一个解决方案是在 USB key 的根目录中创建一个 .bat 脚本,如下所示:
@echo off
set basepath=%~dp0
"%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
这似乎并不关心分配给 USB key 的驱动器盘符,但它确实会在我的程序运行时让 DOS 窗口保持打开状态。功能齐全,但丑陋。
接下来我尝试了这样的 .bat 脚本:
@echo off
set basepath=%~dp0
start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
(有关有趣引用的解释,请参阅 here)
现在,在我的 GUI 打开之前,DOS 窗口会在屏幕上短暂闪烁。少丑!还是丑。
真正的男人如何处理这个问题?从 USB 内存棒在 Windows 机器上启动 python Tkinter GUI 的最不丑陋的方法是什么?
编辑: 下面的所有答案都非常好(py2exe、pyinstaller、small .exe、.wsf 脚本。).wsf 解决方案是最简单的,所以我现在使用它。如果我想要更漂亮的图标和标准的 .exe 扩展名,我可能最终会切换到其他三种解决方案之一。谢谢大家!
最佳答案
可以使用此 Windows 脚本宿主脚本(文件扩展名 .wsf)代替批处理文件:
<job>
<script language="VBScript">
set WshShell = WScript.CreateObject("WScript.Shell")
CMDFile = "App\\pythonw.exe App\\gui.py"
WshShell.Run CMDFile, 1
</script>
</job>
更新:或者编译此 C 程序并链接图标资源:
#include <windows.h>
#include <process.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
return _spawnl(_P_NOWAIT, "App/pythonw.exe", " App/gui.py", lpCmdLine, NULL);
}
更新 2:要构建带图标的 App.exe,将 C 代码保存到 app.c,创建一个 Windows 图标文件 app.ico,并将以下行保存到 app.rc:
appicon ICON "app.ico"
使用 Visual Studio 2008 Express,运行这些命令:
"C:\Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"
rc.exe app.rc
cl.exe app.c /FeApp.exe /link app.res
或者使用“Visual Studio 2010 Express”或“Microsoft Windows SDK v7.0 for Windows 7 and .NET Framework 3.5 Service Pack 1”并相应地调整命令。
请注意,该图标将仅用于 App.exe 启动程序,而不用于您的 Python 程序。
关于python - 我应该如何在不丑陋的情况下在 Windows 上启动一个 Portable Python Tkinter 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4652356/