• 用Python和py2app写独立的Mac OS X 应用


    文/lovexiaov(简书作者)
    原文链接:http://www.jianshu.com/p/afb6b2b97ce9
    著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

    前提

    创建一个普通文件夹,并创建一个virtualenv环境:

    # Create a custom directory
    $ mkdir SandwichApp
    $ cd SandwichApp
    
    # Use virtualenv to create an isolated environment
    $ virtualenv venv
    $ . venv/bin/activate

    现在,创建一个简单的Tkinter应用,并其命名为 Sandwich.py

    import sys
    if sys.version_info < (3, 0):
        # Python 2
        import Tkinter as tk
    else:
        # Python 3
        import tkinter as tk
    root = tk.Tk()
    root.title("Sandwich")
    tk.Button(root, text="Make me a Sandwich").pack()
    tk.mainloop()
    
     

    这个小应用是这个样子:


    app_screen.png

    安装 py2app

    原版的 py2app 由于 ModuleGraph 更新了版本产生了一个 bug。我 fork 了该工程,解决了 bug,然后放到了 Github。使用 pip 安装 py2app:

    $ pip install -U git+https://github.com/metachris/py2app.git@master

    创建 setup.py 文件

    py2app 包含了 py2applet 工具, 此工具可以帮你创建 setup.py 文件:

    $ py2applet --make-setup Sandwich.py
    Wrote setup.py

    setup.py 文件是对应用的基本定义:

    from setuptools import setup
    
    APP = ['Sandwich.py']
    DATA_FILES = []
    OPTIONS = {'argv_emulation': True}
    
    setup(
        app=APP,
        data_files=DATA_FILES,
        options={'py2app': OPTIONS},
        setup_requires=['py2app'],
    )
    
    如果你的应用使用的其他文件,比如 JSON 文件,文本文件,图片等,你应该将他们包含在 DATA_FILES 中。 例如:
    DATA_FILES = ['testdata.json', 'picture.png']

    创建开发版和测试版的应用

    py2app 基于在 setup.py 文件的定义创建独立应用。

    为了方法测试和开发,py2app 提供了“别名模式”,该模式通过与开发文件象征性的链接构建应用。

    $ python setup.py py2app -A

    此命令创建了如下文件和文件夹:

    .
    ├── build
    │   └── bdist.macosx-10.10-x86_64
    │       └── python2.7-standalone
    │           └── app
    │               ├── Frameworks
    │               ├── collect
    │               ├── lib-dynload
    │               └── temp
    ├── Sandwich.py
    ├── dist
    │   └── Sandwich.app
    │       └── Contents
    │           ├── Info.plist
    │           ├── MacOS
    │           │   ├── Sandwich
    │           │   └── python -> /Users/chris/Projects/chris/python-gui/tkinter/env/bin/../bin/python
    │           ├── PkgInfo
    │           └── Resources
    │               ├── __boot__.py
    │               ├── __error__.sh
    │               ├── lib
    │               │   └── python2.7
    │               │       ├── config -> /Users/chris/Projects/chris/python-gui/tkinter/env/bin/../lib/python2.7/config
    │               │       └── site.pyc -> ../../site.pyc
    │               ├── site.py
    │               └── site.pyc
    └── setup.py

    这并不是一个独立的应用,并且通过别名模式构建的应用不适用于其他机器。

    别名模式下构建的应用直接引用了源码文件,所以任何对 Sandwich.py 文件作的修改在应用下次启动时会立刻生效。

    位于 dist/Sandwich.app 的开发应用可以和其他 .app 应用一样,在 Finder 中或通过 open 命令($ open dist/Sandwich.app)启动。你可以在终端执行如下命令启动你的应用:

    $ ./dist/Sandwich.app/Contents/MacOS/Sandwich

    构建发布版应用

    当测试通过后,你可以通过调用 python setup.py py2app 来生成发布版。确保旧的 builddist 文件类都被删除了:

    $ rm -rf build dist
    $ python setup.py py2app

    此命令会将你的应用打包为 dist/Sandwich.app。由于该应用是自包含的,在任意时刻,如果你修改了代码,数据文件,选项等,你都可以再次运行 py2app 命令重新构建。

    原版的 py2app 有一个 bug,会出现 “AttributeError: 'ModuleGraph' object has no attribute 'scan_code'” 或者 load_module。如果你遇到此错误,请参考 StackOverflow 或者使用我的 py2app fork

    此时此刻,最简单的打包并发布应用的方法是在 Finder 中右击该应用选择“创建归档”。

    添加一个图标:

    OPTIONS 字典中添加 "iconfile": "youricon.icns" 即可:

    from setuptools import setup
    
    APP = ['Sandwich.py']
    DATA_FILES = []
    OPTIONS = {
        'argv_emulation': True,
        'iconfile': 'app.icns'
    }
    
    setup(
        app=APP,
        data_files=DATA_FILES,
        options={'py2app': OPTIONS},
        setup_requires=['py2app'],
    )
    

      

    你可以在网上找到 icns 格式的图标(例如:IconFinder或者freepik)。

    应用高级设置

    你可以通过修改 Info.plist 来调用应用的信息各行为。最完整的对可用的键的引用是Apple's Runtime Configuratin Guidelines

    下面是一个有更多修改的例子:

    # -*- coding: utf-8 -*-
    from setuptools import setup
    
    APP = ['Sandwich.py']
    APP_NAME = "SuperSandwich"
    DATA_FILES = []
    
    OPTIONS = {
        'argv_emulation': True,
        'iconfile': 'app.icns',
        'plist': {
            'CFBundleName': APP_NAME,
            'CFBundleDisplayName': APP_NAME,
            'CFBundleGetInfoString': "Making Sandwiches",
            'CFBundleIdentifier': "com.metachris.osx.sandwich",
            'CFBundleVersion': "0.1.0",
            'CFBundleShortVersionString': "0.1.0",
            'NSHumanReadableCopyright': u"Copyright © 2015, Chris Hager, All Rights Reserved"
        }
    }
    
    setup(
        name=APP_NAME,
        app=APP,
        data_files=DATA_FILES,
        options={'py2app': OPTIONS},
        setup_requires=['py2app'],
    )
    

      

     

    通过设置,应用会拥有下面的信息:


    get_info.png

     

  • 相关阅读:
    使文字背景透明
    文件拷贝
    鼠标选取图象的实现
    刷新整个画布
    将区域的颜色取反
    用API处理位图
    用TImageList动态画透明图片
    将bmp文件转换为jpg文件
    解决phpmyadmin-1800秒超时链接失效问题
    Linux下解压命令大全
  • 原文地址:https://www.cnblogs.com/alan-babyblog/p/5297025.html
Copyright © 2020-2023  润新知