python - 我应该如何在不丑陋的情况下在 Windows 上启动一个 Portable Python Tkinter 应用程序?

标签 python windows tkinter relative-path portable-executable

我使用 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/

相关文章:

python - 在 Python 中编写一个无限和(具有积分的函数)

python - 并行排序两个 numpy 矩阵,逐行排序

python - 在 Windows 上使用 python 截屏的最快方法

Python:将文本文件中的单词拆分为有限的 40 个字符并用空格填充额外的 "slot"

python - Tkinter "entry"对象未更新 textvariable 变量(Python 3.4)

PYTHON:如何使用 tkinter 将两个标签锚定到顶部

python - tkinter 中不断更新图表

python - 删除由多个 tkinter 小部件组成的对象

python - 在 Windows 10 上安装 gtk3 + glade

R read.table() 从 pc vs mac