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ファイルができるので,ダブルクリックしてみましょう.
このようにウインドウが表示されるはずです.
最後に
PySideなどを単体でインストールしていくと,ディレクトリが複雑になりすぎるのか,cx_freezeでエラーするのですが,/opt/local以下に集約してくれるMacPortsならうまくfreezeできるみたいです.これでPythonとQtを使ったGUIアプリケーションをappファイルにして公開できます(^^)