MacPythonについてのページ(よ)>
Python(MyApp) で Mac アプリケーションを作る|目次

第8回 アバウトメニュー/アバウトボックス


このページの目次

Apple メニューのアバウトアイテム About MyApp... について
簡単なアバウトボックスを作る
アバウトアイテムの文字列を変える
    クラスを『SpeakApp』に変えればいい!
    クラス名でもいいけど、他の文字列にしたい...
ここまでのまとめ


Apple メニューのアバウトアイテム About MyApp... について

今回はアプリケーション自体の動作には全く関係ないのですが、Apple メニューのアバウトアイテム、アバウトボックスについて書きます。

このようなことは使い捨てのスクリプトには全く不要ですが、『Python を使って手軽に』ではありますが、 『Mac のアプリケーションを作る』というがこのシリーズの目的なので、アバウトボックスとか、アプリケーションのアイコンって、大切だと思うんです。自分で作ったアプリケーションのアイコンを考えたり、アバウトメニュー/アバウトボックス作るのって楽しいですし。

簡単なアバウトボックスを作る

MyApp.py の中で Apple メニューの 『About MyApp...』を選ぶと、以下のダイアログが表示されます。(MacPython2.2.1 だとちょっと形が違います)

About ダイアログ

この表示をしているのは、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 わかりました。

クラスを『SpeakApp』に変えればいい!

ということで、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() のままだと、「そんなクラスはない」とエラーが出ます。

実行してみると以下のようなメニューアイテムになります。

SpeakApp のメニューアイテム

クラス名でもいいけど、他の文字列にしたい...

という場合には、上で見たようにMyApp のスーパークラスである FrameWork.Application の getabouttext メソッドが Apple メニューのアバウトテキストを return で返してるんですから、getabouttext メソッドを MyApp クラスでオーバーライドすればいいんです。クラス名は『MyApp』のままにして、上の # Run the app も MyApp() に戻して、以下のメソッドを MyApp クラスに加えます。

MyApp.py
231-
----------------------------------------------
  def getabouttext(self):
    return "SpeakApp について..."
----------------------------------------------

日本語も使えるので、上のようにすると、以下のようになります。

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)を作りました。

長くなるので、今回はここまで。次こそは『アバウトボックスとしてウィンドウを表示させよう』を書きます。


<▲このページのTOPへ>
戻る   次へ
Python(MyApp) で Mac アプリケーションを作る|目次
MacPythonについてのページ(よ)トップへ

by ©Hioryuki Yoshimura, 2002-2003.
Last modified at 2003/1/22