【问题标题】:How should I launch a Portable Python Tkinter application on Windows without ugliness?我应该如何在不丑陋的 Windows 上启动 Portable Python Tkinter 应用程序?
【发布时间】:2011-06-06 20:17:03
【问题描述】:

我使用 Tkinter 在 python 中编写了一个简单的 GUI 程序。我们称这个程序为“gui.py”。我的用户使用Portable Python 从 USB 密钥在 Windows 机器上运行“gui.py”;在主机上安装任何东西都是不可取的。

我希望我的用户通过双击 USB 密钥根目录中的图标来运行“gui.py”。我的用户不关心 python 是什么,如果他们不需要,他们也不想使用命令提示符。我不希望他们关心 USB 密钥分配的驱动器号。我希望它可以在 XP、Vista 和 7 上运行。

我的第一个丑陋的解决方案是在 USB 密钥的根目录中创建一个快捷方式,并将快捷方式的“目标”属性设置为“(root)\App\pythonw.exe (root)\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"

(请参阅here 了解有趣的引用)

现在,在我的 GUI 打开之前,DOS 窗口会在屏幕上短暂闪烁。不那么丑!还是很丑。

真正的男人如何处理这个问题?从 USB 记忆棒在 Windows 机器上启动 python Tkinter GUI 最不难看的方法是什么?

编辑: 下面的所有答案都非常好(py2exe、pyinstaller、小 .exe、.wsf 脚本。) .wsf 解决方案是最简单的,所以我现在正在使用它。如果我想要一个更漂亮的图标和标准的 .exe 扩展名,我可能最终会切换到其他三个解决方案之一。谢谢大家!

【问题讨论】:

    标签: python windows tkinter relative-path portable-executable


    【解决方案1】:

    使用py2exe 使其成为单个可执行文件。

    【讨论】:

    • 感谢您的有用建议。我将尝试 py2exe,并报告。
    • 你也可以让你的程序保持原样,但是用python写一个小启动器并用py2exe编译它。
    【解决方案2】:

    使用pyinstaller 压缩您的发行版(与py2exe 相比的优势在于它knows 不同的第三方库,并且通常是最新的)。

    然后您可以创建一个 .exe 供您的用户单击以启动您的应用程序。如果你只是将 pyinstaller 构建的结果复制到你的 USB 驱动器上,你应该没问题。

    【讨论】:

    • 我可以在这里为自己说话,但我从来没有遇到过 py2exe 的任何问题,另一方面,pyinstaller 从来没有让它工作。此外,最新的,它甚至还支持 Python 2.6 吗?
    • @Anders:我在 Python 2.6(和 Python 2.7)中使用过它,所以我不知道你在哪里读到的(关于不支持 2.6)?这可能是个人喜好问题,这是轶事证据,但我个人在 py2exe 方面遇到了更大的问题(尤其是在需要运送多个第三方库时)...... Pyinstaller 的 64 位支持也是加上我上次检查的时间。
    • 啊,是的,现在有支持。而且,py2exe 也适用于 64 位。
    • 好吧 pyinstaller 是跨平台的(这是 py2exe 没有的功能);-) 我不会将 py2exe 称为最新版本,其最新版本可追溯到 2008-11 年。有传言说它的开发已经停止(或者至少节奏很慢)。
    • 感谢您的有用建议。我会尝试 pyinstaller,然后报告。
    【解决方案3】:

    您可以通过编写您自己的调用system('start "" "%basepath%App\pythonw.exe" "%basepath%\App\gui.py"') 的小C 应用程序以一种hacky 方式做到这一点。接下来你在没有控制台的情况下编译它并将其用作“快捷方式”。

    【讨论】:

    • 我喜欢这种精神。我会试试这个,然后报告。
    • 另一个优点是您可以在 EXE 中打包自己的图标,从而获得漂亮的平滑效果:)
    【解决方案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 and .NET Framework 3.5 Service Pack 1”并相应地调整命令。

    请注意,该图标将仅用于 App.exe 启动程序,而不是您的 Python 程序。

    【讨论】:

    • 哇,我从没听说过。谢谢!适用于 XP,现在正在测试 7。
    • 适用于 7。非常简单。我想唯一真正的缺点是不寻常的扩展名和图标。
    • 不知道图标要求。否则会建议编译一个 exe 程序(如 nightcracker 的回答)。
    • 很好的补充,+1 包括代码。我应该在 Windows 中使用什么编译器?如何链接图标资源?很抱歉问这些基本问题,但我只使用过 Linux 中的 C。
    • 非常感谢。很好的答案。
    【解决方案5】:

    简答:

    这个问题是几年前提出的,但我最近为我正在研究的一个程序找到了一个解决方案,它可能对其他人仍然有用。使用这种方法,您将能够创建一个独立的 exe 程序启动器,它可以放置在任何地方并引用其同一文件夹或子目录中的文件,同时拥有您选择的漂亮图标,并且不会弹出 DOS 屏幕。换句话说,一个真正好看的相对路径可传输的快捷方式文件:)

    即使对于非程序员,该解决方案也应该易于理解和执行,如下所示:

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

    (请注意,此解决方案与http://www.freewaregenius.com/how-to-create-shortcuts-with-a-relative-path-for-use-on-usb-drives/ 建议的几乎相同。但是,当前的解决方案在步骤 2 中使用的代码方面有所不同,它允许将启动程序放置在计算机上的任何位置,而不仅仅是在U盘的顶层目录,并且是新的强调应该检查不可见选项。这些差异是至关重要的。)

    更多详情(可选):

    最初的问题是:“从 USB 记忆棒在 Windows 机器上启动 python Tkinter GUI 最不难看的方法是什么?”

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

    提出了几种可能的解决方案,但迄今为止没有一个满足所有标准。最初的海报选择了“.wsf”选项,它允许相对路径和没有丑陋的 DOS 窗口,但不允许自定义图标或可识别的 exe 文件。

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

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

    【讨论】:

      【解决方案6】:

      你也可以 fork Portable Python sources on GitHub 并以创建其他 Portable Python 快捷方式的相同方式创建快捷方式。

      这为您提供了启动应用程序、图标的好方法,您可以根据需要设置自定义注册表/环境变量等。

      作为一个例子,你可以举个例子。来自Portable Python 来源的 IDLE 快捷方式。

      【讨论】:

        【解决方案7】:

        我制作了一个批处理脚本 (PyRunEXE),它编译了一个简单的汇编语言代码来为您制作一个 EXE 启动器:

        https://github.com/SzieberthAdam/pyrunexe

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-30
          • 2012-12-25
          • 2016-10-29
          • 1970-01-01
          • 2018-06-16
          • 1970-01-01
          相关资源
          最近更新 更多