我应该如何在Windows上启动一个可移植的Python Tkinter应用程序而不会有任何丑陋?

我已经使用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屏幕。 换句话说,一个真正的好看的相对路径可移动的快捷方式文件:)

解决方案应该很容易遵循,甚至对于非程序员也是如此,如下所示:

  1. 打开记事本
  2. 写:%windir%\ system32 \ cmd.exe / c开始“”“%CD%\可选的子文件夹\ mainpy2exeGUI.exe”
  3. 另存为“whatever.bat”
  4. 在检查“不可见的应用程序”选项时,使用名为“BAT到EXE转换器”的程序将bat文件转换为exe文件,并在“versioninformations”选项卡下选择所需的图标文件。 您可以将输出的exe文件命名为任何你想要的。 链接到转换器程序可以在http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/转换器程序下载包含一个32位和64位版本,使用32位版本使快捷键可以使用旧PC和新PC&#x3002;

(注意,这个解决方案和http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/中的建议几乎一样。目前的解决方案在步骤2中使用的代码是不同的,这允许启动器程序被放置在计算机上的任何地方,而不仅仅是在USB棒的顶部目录中,并且强调隐形选项应该是新的检查。这些差异是至关重要的。&#xFF09;

更多详情(可选):

原来的问题是:“从U盘启动Windows机器上的Python Tkinter GUI最丑陋的方式是什么?

需要的可以分解为四件事情:1.一个exe程序启动器。 2.适用于任何计算机和任何目录(即支持相对路径)。 那有一个图标。 4.这不会打开一个“丑陋的”DOS窗口。

有几个可能的解决方案建议,但没有一个满足所有标准。 原来的海报去了“.wsf”选项,允许相对路径和丑陋的DOS窗口,但不允许自定义图标或可识别的exe文件。

先前建议的解决方案的部分问题包括:

  1. 你没有C / VB编程技能或软件。
  2. 你想要一个图标到你的启动程序。 使用执行“cmd”的快捷方式文件并使用它来打开您的GUI文件将允许您设置图标文件,但是图标文件引用是绝对的,并且在除创建快捷方式文件之外的任何其他计算机上都会失败。
  3. 你不希望“丑陋的”DOS窗口闪烁。 在前面提到的cmd快捷方式解决方案创建一个DOS窗口,在打开您的GUI之前闪烁。
  4. 将py2exe主要的可执行文件作为程序启动程序几乎是一个完美的解决方案,因为它满足所有的标准,但是反过来py2exe可执行文件将需要一个丑陋的“tlc”文件夹放在同一个顶层目录中。 因此,最好将主要的py2exe启动程序隐藏在一个很好的命名子文件夹中。 此外,有很多情况下,人们希望保持程序启动程序和程序本身作为单独的exe文件,例如,如果您只是使用您的主要py2exe程序作为一个python的运行者,可以启动开放式可编辑的python脚本,您可以随时编辑,而无需每次对某个脚本进行更改时创建新的py2exe文件。

您也可以在GitHub上分发可移植的Python源代码,并以与创建其他可移植的Python快捷方式相同的方式创建快捷方式。

这给你很好的方式来启动应用程序,图标,你可以设置自定义注册表/环境变量,如果你需要等等等等。

作为一个例子,你可以从例如可移植Python源的IDLE快捷方式。

我已经做了一个批处理脚本(PyRunEXE)编译一个简单的汇编语言代码来为你做一个EXE启动器:

https://github.com/SzieberthAdam/pyrunexe