我已经使用Tkinter在Python中编写了一个简单的GUI程序。 我们把这个程序称为“gui.py”。 我的用户使用可移植的Python从USB密钥在Windows机器上运行'gui.py'; 在主机上安装任何东西都是不可取的。
我希望我的用户通过双击USB根目录下的图标来运行“gui.py”。 我的用户不关心python是什么,他们不想使用命令提示符,如果他们不必。 我不希望他们必须关心分配USB密钥的驱动器号码。 我想在XP,Vista和7上工作。
我的第一个丑陋的解决scheme是在USB根目录下创build一个快捷方式,并将快捷方式的“Target”属性设置为“(root)\ App \ pythonw.exe(root)\ App \ gui.py “,但我不知道如何做一个窗口快捷方式的相对path,并使用像”E:“这样的绝对path似乎是脆弱的。
我的下一个解决scheme是在USB密钥的根目录下创build一个.bat脚本,如下所示:
@echo off set basepath=%~dp0 "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
这似乎并不关心什么驱动器字母的USB密钥分配,但它会留下一个DOS窗口打开时,我的程序运行。 function性,但丑陋。
接下来我尝试了一个像这样的.bat脚本:
@echo off set basepath=%~dp0 start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"
( 这里有关有趣的引用的解释)
现在,在我的GUI打开之前,DOS窗口在屏幕上短暂地闪烁。 less丑! 仍然丑陋。
真正的男人如何处理这个问题? 用U盘在Windows机器上启动python Tkinter GUI最丑陋的方法是什么?
编辑:下面的所有答案是非常好的(py2exe,pyinstaller,小型.exe,.wsf脚本。).wsf解决scheme是最简单的,所以我现在使用它。 如果我想要一个漂亮的图标和标准的.exe扩展名,我可能会最终切换到其他三种解决scheme之一。 感谢大家!
可以使用此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”或“Windows 7和.NET Framework 3.5 Service Pack 1的Microsoft Windows SDK v7.0”,并相应地调整命令。
请注意,图标将只用于App.exe启动程序,而不是您的Python程序。
使用pyinstaller来压缩你的发行版(py2exe的优点是它knows
不同的第三方库,通常是更新的)。
然后,您可以为您的用户创建一个.exe来点击启动您的应用程序。 如果你只是将pyinstaller build的结果复制到你的USB驱动器上,你应该没问题。
使用py2exe将其制作成单个可执行文件。
你可以通过编写你自己的调用system('start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"')
的小应用程序system('start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"')
以一种很冒险的方式来做到这一点。 接下来,你可以在没有控制台的情况下编译它,并将它用作“快捷方式
简答:
这个问题在几年前就被问到了,但是我最近发现了一个我正在研究的程序的解决方案,可能对其他程序仍然有用。 使用这种方法,您将能够创建一个独立的exe程序启动器,可以放在任何地方,并在同一个文件夹或子目录中引用一个文件,同时拥有一个漂亮的图标,并且不会弹出DOS屏幕。 换句话说,一个真正的好看的相对路径可移动的快捷方式文件:)
解决方案应该很容易遵循,甚至对于非程序员也是如此,如下所示:
更多详情(可选):
原来的问题是:“从U盘启动Windows机器上的Python Tkinter GUI最丑陋的方式是什么?
需要的可以分解为四件事情:1.一个exe程序启动器。 2.适用于任何计算机和任何目录(即支持相对路径)。 那有一个图标。 4.这不会打开一个“丑陋的”DOS窗口。
有几个可能的解决方案建议,但没有一个满足所有标准。 原来的海报去了“.wsf”选项,允许相对路径和丑陋的DOS窗口,但不允许自定义图标或可识别的exe文件。
先前建议的解决方案的部分问题包括:
您也可以在GitHub上分发可移植的Python源代码,并以与创建其他可移植的Python快捷方式相同的方式创建快捷方式。
这给你很好的方式来启动应用程序,图标,你可以设置自定义注册表/环境变量,如果你需要等等等等。
作为一个例子,你可以从例如可移植Python源的IDLE快捷方式。
我已经做了一个批处理脚本(PyRunEXE)编译一个简单的汇编语言代码来为你做一个EXE启动器: