View All Posts. MiCHiLU.com powered by Django ;-)

[Python]: PyObjC版Cocoaセミナー初級編1

HMDT 木下さんの Cocoaセミナー 初級編をPyObjCでやってみる。

準備するもの

パッケージで配布されているので、ダウンロードしてインストールしておきます。

資料

Hello World

ボタンを押すとボックスにテキストが表示されるアプリケーションを作ります。 「Cocoaセミナー初級編」のテキストに沿って作業を進めます。 通常のCocoa Applicationと異なる点は、

といったところです。

では作業開始。 まず、テキストでいうところの「4.1 新規プロジェクトの作成」で 「PyObjC Application」を選択して作業を進めます。 その後はテキスト通りにInterface BuilderでViewを作ります。

次に、テキストでいうところの「4.7 Controllerクラスの実装]では、 さきほどInterface Builderで作成した MainMenu.nib を元に Controllerクラス (Python) の雛形を生成してcontrollerを実装していきます。

$ python -c "import PyObjCScripts.nibclassbuilder" English.lproj/MainMenu.nib > HelloWorld.py

Pythonのファイル名は、buildされるApplication ディレクトリ(.app)名になるので、 適当な名前にしておきます。

HelloWorld.py

import objc
from Foundation import *
from AppKit import *
from PyObjCTools import NibClassBuilder, AppHelper


NibClassBuilder.extractClasses("MainMenu")


# class defined in MainMenu.nib
class Controller(NibClassBuilder.AutoBaseClass):
    # the actual base class is NSObject
    # The following outlets are added to the class:
    # textField

    def Say_(self, sender):
        pass


# class defined in MainMenu.nib
class Hello_WorldAppDelegate(NibClassBuilder.AutoBaseClass):
    # the actual base class is NSObject
    pass



if __name__ == "__main__":
    AppHelper.runEventLoop()

Interface Builderで作成した Controller クラスとそのアトリビュート textField (Outlets) , Say_ (Actions) が組み込まれています。 Controller.Say_ を実装します。

HelloWorld.py

class Controller(NibClassBuilder.AutoBaseClass):
    ...
    def Say_(self, sender):
        self.textField.setStringValue_(u"Hello World!")

「4.8 ビルドと実行」 さてbuildの準備です。 defaultの setup を書き換えます。 app にControllerを記述したPythonファイル名を、 DateTimeField にnibディレクトリ名をセットします。

setup.py

setup(
    app=['HelloWorld.py'],
    data_files=['English.lproj/MainMenu.nib'],
)

buildします。

$ python setup.py py2app -A
running py2app
creating /Hello World/build
creating /Hello World/build/bdist.macosx-10.3-fat
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/collect
creating /Hello World/build/bdist.macosx-10.3-fat/python2.4-standalone/app/temp
creating /Hello World/dist
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/lib-dynload
creating build/bdist.macosx-10.3-fat/python2.4-standalone/app/Frameworks
*** creating application bundle: HelloWorld ***

$ open dist/HelloWorld.app

dist ディレクトリの下に app ができているので起動してみます。 これで Objective-C で実装した場合と同じ動作になると思います。

Interface Builderで定義した class は English.lproj/MainMenu.nib/classes.nib に書いてあります。

English.lproj/MainMenu.nib/classes.nib

{
    IBClasses = (
        {
            ACTIONS = {Say = id; };
            CLASS = Controller;
            LANGUAGE = ObjC;
            OUTLETS = {textField = id; };
            SUPERCLASS = NSObject;
        },
        {CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
        {CLASS = "Hello_WorldAppDelegate"; LANGUAGE = ObjC; SUPERCLASS = NSObject; }
    );
    IBVersion = 1;
}

PyObjCTools.NibClassBuilder は PyObjCTools.NibInfo のsubclassです。

NibClassBuilder.extractClasses("MainMenu")MainMenu.nib/classes.nib を解析して NibClassBuilder.classes をセットしています。

textField の型を見てみます。

HelloWorld.py

class Controller(NibClassBuilder.AutoBaseClass):
    ...
    def Say_(self, sender):
        self.textField.setStringValue_(type(self.textField))

NSTextField と表示されます。

Xcode の Developer Documentation で検索してみると NSTextField Class Reference がヒットします。 Companion guide のリンクを辿ると Text Fields についてのドキュメントが見れます。

さらに Text Fields の Inherits from から NSControl のリンクを辿り NSControl Class Reference を参照すると Setting the control’s value に setStringValue: がリストされています

PyObjC における setStringValue_ は、Objectiv-Cの setStringValue: に対応するようです。

他にも、

がリストされています。

Thu, 27 Sep 2007 00:42:31 +0900 source edit
Creative Commons License
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 2.1 Japan License.
View All Posts. MiCHiLU.com powered by Django ;-)