みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

QtなPythonスクリプトをcx_Freezeでappにする (Mac OS X)

Pythonで,GUIをQtで実装したスクリプトを,Mac用のappファイルにする方法をメモしておきます.実はこれを実現するのは以前から苦労していましたが,MacPortsを使えば一発であることに気づいたのです.

MacPortsをインストールしていない場合はこちらからダウンロードしてください.

みーはメインのOS XがMacPortsでごちゃごちゃするのが嫌だったので,VMware Fusion 6.0.2 上のゲストOSとして動作している OS X 10.9.2 (Mavericks) 上で以下の作業を行っていますが,普通のOS Xでも同じようにすればうまくいくと思います.

必要なPortsのインストール

Terminalを開いて,MacPortsを起動します.

    $ sudo port
    Password:
    MacPorts 2.2.1
    Entering interactive mode... ("help" for help, "quit" to quit)

インタラクティブモードに入るので,cx_freezeとpysideをインストールします.portの名前はsearchコマンドで適当に探してください.ここでは現在の安定版であるPython3.3用のportで統一しています.

    > install py33-cx_Freeze py33-pyside
    --->  Computing dependencies for py33-cx_Freeze
    --->  Dependencies to be installed: python33 bzip2 gettext expat libiconv ncurses libedit openssl zlib python_select sqlite3 xz
    ...
    --->  Computing dependencies for py33-pyside
    --->  Dependencies to be installed: py33-shiboken libxslt libxml2 qt4-mac dbus jpeg libmng lcms tiff libpng sparsehash
    ...

完了するに結構時間がかかりました.気長に待ちます.処理が終了したら,以下のコマンドを実行して,Python33を標準とします.

    > select --set python python33
    Selecting "python33" for "python" succeeded. "python33" is now active.
    [Users/atsuhiro] > quit
    Goodbye

後ほどpyside-uicも必要になるので,MacPortにて

    install py33-pyside-tools

も実行しておくのがよいでしょう.

以上で必要なportsは揃いました.バージョンをまとめると以下のようになりました.

  • py33-cx_Freeze-4.3.1_0.darwin_13.x86_64
  • qt4-mac-4.8.5_1.darwin_13.x86_64
  • py33-pyside-1.2.1_1.darwin_13.x86_64

cx_freezeでhello world

以下のファイルを用意します.

# ex.py
print("hello world.")
# setup.py
import sys
from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "ex",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("ex.py", base=base)])

これらのファイルを同じディレクトリに置いて,Terminalで移動してから,以下のコマンドを実行します.

    python setup.py build

これで,buildというフォルダーにたくさんのファイルが出力され,exというファイルをFinderでダブルクリックすればTerminalにてHello worldと出力されます.

以上で,cx_freezeの動作チェックが完了です.

PySideでHello world

以下のファイルを作成します.

# test.py
# The code is placed into public domain by anatoly techtonik
# Feel free to copy/paste wherever you like

# Absolutely minimal example of PySide application with button calling dialog

# More info about Qt dialogs:
# http://www.pyside.org/docs/pyside/PySide/QtGui/QDialog.html#PySide.QtGui.QDialog

from PySide.QtGui import QApplication, QPushButton, QColorDialog, QMessageBox,\
                         QPixmap


def choose_color():
    # Select color
    color  = QColorDialog().getColor()
    
    # Report about result of selection in QMessageBox dialog
    msgbox = QMessageBox()
    if color.isValid():
        # Create a memory image 50x50 filled with selected color to display
        # as a icon in the msgbox dialog
        pixmap = QPixmap(50, 50)
        pixmap.fill(color)
        msgbox.setWindowTitle(u"Selected Color")
        msgbox.setIconPixmap(pixmap)
    else:
        msgbox.setWindowTitle(u"No Color was Selected")
    msgbox.exec_()


app = QApplication([])
    
# Create top level window/button
button = QPushButton("Choose Color")
# Call function that invokes color selection dialog when the button is clicked
button.clicked.connect(choose_color)
button.show()

app.exec_()
# setup.py
import sys
from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "test",
        version = "0.1",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("test.py", base=base)])

同様に同じディレクトリに置いて,Terminalにて以下のコマンドを実行します.

    python setup.py bdist_mac

先ほどとは異なり,bdist_macオプションをつけていますが,これはappファイルを書き出すオプションです.buildオプションでも構いません.

これでappファイルができるので,ダブルクリックしてみましょう.

f:id:atsuhiro-me:20151104004454p:plain:w300

このようにウインドウが表示されるはずです.

最後に

PySideなどを単体でインストールしていくと,ディレクトリが複雑になりすぎるのか,cx_freezeでエラーするのですが,/opt/local以下に集約してくれるMacPortsならうまくfreezeできるみたいです.これでPythonとQtを使ったGUIアプリケーションをappファイルにして公開できます(^^)