Apple メニューのアバウトアイテム About MyApp... について
簡単なアバウトボックスを作る
アバウトアイテムの文字列を変える
クラスを『SpeakApp』に変えればいい!
クラス名でもいいけど、他の文字列にしたい...
ここまでのまとめ
今回はアプリケーション自体の動作には全く関係ないのですが、Apple メニューのアバウトアイテム、アバウトボックスについて書きます。
このようなことは使い捨てのスクリプトには全く不要ですが、『Python を使って手軽に』ではありますが、 『Mac のアプリケーションを作る』というがこのシリーズの目的なので、アバウトボックスとか、アプリケーションのアイコンって、大切だと思うんです。自分で作ったアプリケーションのアイコンを考えたり、アバウトメニュー/アバウトボックス作るのって楽しいですし。
MyApp.py の中で Apple メニューの 『About MyApp...』を選ぶと、以下のダイアログが表示されます。(MacPython2.2.1 だとちょっと形が違います)
この表示をしているのは、MyApp.py の MyApp クラスの do_about メソッドです。以下に示す部分です。
以後の MyApp.py の内容と行番号は、前回までに作った speak3.sit.bin(約 30k)のものです。
MyApp.py 173-176 ---------------------------------------------- def do_about(self, id, item, window, event): # This shows your application's about box. # Replace it EasyDialogs.Message("Hello! Widget Application World " + self.__class__.__name__) ----------------------------------------------
EasyDialogs.Message を使って、文字列を表示しているだけです。self.__class__.__name__ を使って、自分自身のクラスの名前の文字列 "MyApp" も加えています。
EasyDialogs モジュールには他に AskString、YesNoCancel なんかがあって、ユーザと簡単なやり取りをするのに便利ですね。
アバウトボックスを自分なりのモノにしようと思ったら、英文のコメントにあるように、ここを変えればいいだけです。文字列だけを変えたいのであれば、例えば
EasyDialogs.Message("Speak Application by Yoshimura, \rmade with Python and MyApp.py")
これでいいんです(英文法的にいいかどうかは自信ありません)。"\r" は改行を表します。Unix などでの改行 "\n" も使えます。255 文字まで表示できるようです。
do_about メソッドは id, item, window, event なんかを受け取っていますが、これらをメソッドの中で使っていません。EasyDialogs.Message を使っているだけです。たぶん AppMenu がメニューの id や item の情報なんかを do_about に渡しているんでしょうが、よくわかりません。『そんなものなんだな。いつかそれが必要になるかもしれないし、渡されるということは覚えておこう。でも今は使わなくていいんだから無視しておこう』という気持ちでいます。
この辺で『アバウトボックスとしてウィンドウを表示させよう』というのが出て来そうなところですが、その前に Apple メニューのアバウトアイテム『About MyApp...』を『About SpeakApp...』みたいに変えましょう。
では、About アイテムはどこで作られたりしているんでしょう?MyApp.py の MyApp クラスに makeusermenus メソッドがあって(105行目-)、前回ここのメニューアイテムを変更したりしました。しかし、Apple メニューや About アイテムに関係するようなものはないようです。
そこで、MyApp のスーパークラスである FrameWork.Application クラスを見てみました。すると、以下のメソッドがあります。
Python 2.0:Mac:Lib:FrameWork.py 112-115 ---------------------------------------------- def makemenubar(self): self.menubar = MenuBar(self) AppleMenu(self.menubar, self.getabouttext(), self.do_about) self.makeusermenus() ----------------------------------------------
上の 3 行目に AppleMenu、その下に self.makeusermenus() とあるので、きっとこれがメニューバー全体を扱っているんだと思います。上の3行目の AppleMenu の引数の self.menubar はその上の行で定義している MenuBar クラスのインスタンスのようです。次の引数 self.getabouttext() がその名の通り、『About XXX...』に関わっているのではないでしょうか?そして、3つめの引数 self.do_about はもう見ましたね、アバウトアイテムが選択されると実行するメソッドのようです。getabouttext メソッドを見てみると、
Python 2.0:Mac:Lib:FrameWork.py 135-136 ---------------------------------------------- def getabouttext(self): return "About %s..." % self.__class__.__name__ ----------------------------------------------
やはり、『About "クラス名"』を返しています。(^_^)v わかりました。
ということで、Apple メニューの『About MyApp...』を『About SpeakApp...』変えるには、クラス名を『SpeakApp』にすればいいんです。下のように。
MyApp.py 66 ---------------------------------------------- class SpeakApp(Wapplication.Application): ----------------------------------------------
そして、実行の前にここも変更して下さい。
MyApp.py 231-235 ---------------------------------------------- # Run the app if __name__ == '__main__': ############################### SpeakApp() # ここ重要 ############################### ----------------------------------------------
こうしないと、SpeakApp クラスを実行してくれません。MyApp() のままだと、「そんなクラスはない」とエラーが出ます。
実行してみると以下のようなメニューアイテムになります。
という場合には、上で見たようにMyApp のスーパークラスである FrameWork.Application の getabouttext メソッドが Apple メニューのアバウトテキストを return で返してるんですから、getabouttext メソッドを MyApp クラスでオーバーライドすればいいんです。クラス名は『MyApp』のままにして、上の # Run the app も MyApp() に戻して、以下のメソッドを MyApp クラスに加えます。
MyApp.py 231- ---------------------------------------------- def getabouttext(self): return "SpeakApp について..." ----------------------------------------------
日本語も使えるので、上のようにすると、以下のようになります。
あるいは、後にアプリケーション名を変えたり、というような時のために別にアプリケーション名を定義しておくと便利かもしれません。
MyApp.py 231- ---------------------------------------------- def getabouttext(self): return "%s について..." % __appname__ ----------------------------------------------
みたいにします。そして、class MyApp の定義のすぐ上あたりに、
MyApp.py 64- に追記 ---------------------------------------------- __appname__ = "SpeakApp" ----------------------------------------------
としておきます。この方が後々便利だと思います。
ここまでの MyApp.py と speakwin.py、そして MyApp.rsrc を一つのフォルダに入れた speak4.sit.bin(約 30k)を作りました。
長くなるので、今回はここまで。次こそは『アバウトボックスとしてウィンドウを表示させよう』を書きます。