如何在Windows上优雅地启动便携式Python Tkinter应用?

5 投票
7 回答
8126 浏览
提问于 2025-04-16 09:44

我用Python的Tkinter写了一个简单的图形界面程序,叫做'gui.py'。我的用户是在Windows电脑上通过USB闪存盘运行这个程序,他们使用的是Portable Python,不想在电脑上安装任何东西。

我希望用户能通过双击USB闪存盘根目录下的图标来运行'gui.py'。我的用户对Python并不关心,也不想使用命令提示符,如果不必要的话。我也不想让他们去关心USB闪存盘被分配了哪个驱动器字母。我希望这个程序能在XP、Vista和7上都能运行。

我最初的解决办法是,在USB闪存盘的根目录创建一个快捷方式,把快捷方式的“目标”属性设置为类似“(根目录)\App\pythonw.exe (根目录)\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"

(想了解奇怪的引号用法,可以查看这里)

现在,DOS窗口在我的图形界面打开之前会短暂闪现一下。比之前好一点,但还是不太美观。

真正的高手是怎么解决这个问题的呢?从USB闪存盘在Windows机器上启动Python Tkinter图形界面,最简单的办法是什么?

编辑: 下面的所有答案都很好(py2exe、pyinstaller、小.exe、.wsf脚本)。.wsf的解决方案是最简单的,所以我现在在用这个。如果我想要更好看的图标和标准的.exe扩展名,我可能会换成其他三种解决方案。谢谢大家!

7 个回答

3

使用 py2exe 把它打包成一个单独的可执行文件。

4

使用 pyinstaller 来打包你的程序(相比于 py2exe,它的好处在于它了解各种第三方库,并且通常更新得更快)。

然后你可以创建一个 .exe 文件,用户只需点击这个文件就能启动你的应用程序。如果你把 pyinstaller 打包后的结果直接复制到你的 USB 驱动器上,应该就没问题了。

4

这个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和.NET Framework 3.5 Service Pack 1”,并相应地调整命令。

请注意,这个图标只会用于App.exe启动程序,而不是你的Python程序。

撰写回答