我已经使用Tkinter用python编写了一个简单的GUI程序。让我们将这个程序命名为“gui.py”。我的用户使用Portable Python从U盘上运行Windows机上的'gui.py‘;在主机上安装任何东西都是不可取的。
我希望我的用户通过双击U盘根目录的图标来运行“gui.py”。我的用户并不关心python是什么,如果没有必要,他们也不想使用命令提示符。我不希望他们关心分配给USB闪存盘的驱动器号。我希望它能在XP、Vista和7上运行。
我的第一个丑陋的解决方案是在U盘的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为类似于“(根)\App\pythonw.exe(根)\App\gui.py”的属性,但是我不知道如何在windows快捷方式中使用相对路径,并且使用像"E:“这样的绝对路径似乎很脆弱。
我的下一个解决方案是在U盘的根目录下创建一个.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"(有关这段有趣的引语的解释,请参阅here )
现在,在GUI打开之前,DOS窗口会在屏幕上短暂闪烁。不那么丑陋了!还是很难看。
真正的男人是如何处理这个问题的?在Windows机器上从U盘启动python Tkinter GUI最不丑陋的方式是什么?
编辑:下面所有的答案都非常好(py2exe,pyinstaller,small .exe,.wsf script)。.wsf解决方案是最简单的,所以我现在使用它。如果我想要一个更漂亮的图标和标准的.exe扩展,我可能最终会切换到其他三个解决方案中的一个。谢谢大家!
发布于 2011-01-11 10:20:27
可以使用此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学习版,运行以下命令:
"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 Studio2010Express“或"Microsoft WindowsSDKV7.0 for Windows7和.NET Framework3.5Service Pack1”,并相应地调整命令。
请注意,该图标将仅用于程序,而不是App.exe程序。
发布于 2011-01-11 06:49:22
使用pyinstaller压缩您的发行版(与py2exe相比的优点是它knows了不同的第三方库,并且通常更新)。
然后,您可以创建一个.exe供用户单击以启动您的应用程序。如果您只是将pyinstaller构建的结果复制到您的USB驱动器上,就应该没问题了。
发布于 2011-01-11 06:48:33
使用py2exe将其转换为单个可执行文件。
https://stackoverflow.com/questions/4652356
复制相似问题