この文書はDr. Corran WebsterさんによるW Widgetsを真似て、W Widgetsに説明されたMyApp.pyを使ってMacアプリを作る方法をわたし吉村が説明したものです。
誤っているところや、おかしいところがあるかもしれません。お気づきの点がございましたら、わたしまでお知らせいただければ幸いです。


テンプレートアプリケーション(MyApp.py)でMacアプリを作る


Wウィジェットを使ったアプリケーション
ダブルクリック可能なWウィジェットスクリプト

このセクションでは、Dr. Corran WebsterさんによるW Widgetsに説明されているテンプレートアプリケーション(MyApp.py)を使って、簡単なアプリケーションを作ってみます。
話を簡単にするために、Python1.5.2のPythonIDEのScriptsメニューにある"Search Python Dcumentation..."をスタンドアローンのアプリケーションにしてみます。テンプレートアプリケーション(以下、MyApp.pyと略します)はアプレットあるいはアプリケーション形式へビルドしないと動作しませんが、MyApp.pyを少し書き加えて、ダブルクリックで動作可能なWウィジェットスクリプトを作る方法についても説明します。

Wウィジェットを使ったアプリケーション

Python1.5.2のPythonIDE上でSpriptメニューにある"Search Python Documentation..."を動作させることができますが、『Python 1.5.2c1:Mac:IDE scripts』フォルダの"Search Python Documentation..."のファイルをダブルクリック、あるいはPythonInterpreterにドロップするとエラーが出てしまいます。

エラーの画面

なぜなら、Wウィジェットが必要とするリソースがないからです。Wウィジェットを使ったスクリプトはPythonIDE上でしか動作しないのです。これを解決するシンプルな方法は、Wウィジェットに必要なリソースMyApp.rsrcを加えてMyApp.pyを使ってアプレットまたはアプリケーションにすることです。

方法は以下の通りです。

  1. MyApp.pyとリソースファイルMyApp.rsrcを同じフォルダに入れます。(BuildAppletはアプレットをビルドする時に、スクリプトのファイルの拡張子pyより前の部分(MyApp)と同じ名前のリソース(MyApp.rsrc)を同一フォルダから探して、そのリソースも取り込んでくれます)
  2. MyApp.pyに"Search Python Documentation..."ファイルの内容を書き込んで保存します。 つまり、MyApp.pyの以下の行(だいたい35行目にあります)を
    <変更前>
      # Process some events!
      self.mainloop()
    <変更後>
      # Process some events!
      import PyDocSearch
      # set the creator of the browser. 'MSIE' = Exploser, 'MOSS' = Netscape
      PyDocSearch.SIGNATURE = 'MOSS'
      pds = PyDocSearch.PyDocSearch()
      self.mainloop()
    へ変更します。忘れずに保存してください。
  3. MyApp.pyをBuildAppletあるいはBuildApplicationにドロップします。

MyApp.pyはファイル名を変更してもいいですが、そのときにはMyApp.rsrcも変更してください。XXXX.pyならリソースファイルもXXXX.rsrcにしてください。そうしないと、ビルドのときに取り込んでくれません。

こうしてできたアプレットあるいはアプリケーションはダブルクリックで起動可能で、Wウィジェットもちゃんと機能します。

このようにして、Wウィジェットを使ったスクリプトをself.mainloopの前でインポートしたりすることによってアプリケーションを作ることができます。

ダブルクリック可能なWウィジェットスクリプト

これはこれでいいのですが、スクリプトをいちいちビルドするのは面倒です。それに作成の途中で動作を確認したいこともあるでしょうし、アプレット形式ではなく、スクリプトファイルの形でいつでも編集できるようにしておきたいでしょう。そこで、スクリプトファイルの状態でPythonInterpreterで実行可能なようにMyApp.pyを書き替えましょう。

そうするには、スクリプト実行時にリソースを読み込むように、MyApp.pyに書き加えればいいんです。Python:Mac:Demo:Example2の"dnslookup-2.py"の方法を使います。
MyApp.pyの最初に以下の行を加えます。

# macfreeze: exclude Wthreading
# macfreeze: exclude continuation
### Python2.2では以下の5行も必要です。
# macfreeze: exclude readline
# macfreeze: exclude SOCKS
# macfreeze: exclude msvcrt
# macfreeze: exclude rourl2path
# macfreeze: exclude termios

import EasyDialogs
import Res
import sys
if sys.argv[0][-3:] == '.py':
    RSRC_NAME= sys.argv[0][:-3] + '.rsrc'
else:
    RSRC_NAME= sys.argv[0] + '.rsrc'
try:
    dummy = Res.GetResource('cicn', 468)
except Res.Error:
    try:
        Res.FSpOpenResFile(RSRC_NAME, 1)
    except Res.Error:
        EasyDialogs.Message("Cannot open "+RSRC_NAME)
        sys.exit(1) 

先頭の7行

# macfreeze: exclude Wthreading
# macfreeze: exclude continuation
# macfreeze: exclude readline
# macfreeze: exclude SOCKS
# macfreeze: exclude msvcrt
# macfreeze: exclude rourl2path
# macfreeze: exclude termios

は、わたしの環境でBuildApplicationの実行時に検索しようとしてエラーが出るので加えました。

これでMyApp.pyのダブルクリックあるいはPythonInterpreterへのドロップにより、起動します。

ここで作成した"Search Python Document"スクリプトをmiのPythonモードに添付しています。

このMyApp.pyとMyApp.rsrc(約10k)をひな形として、アプリケーション作成にお役立てください。


誤記、補足など追記。
(2002/07/09)


MacPython2.1.1,2.2.1,2.0,1.5.2c1に対応するようMyApp.pyを書き換えました。
(2002/06/02)


MyApp.pyのテキストファイルに不要な行

from MyDocument import MyDocumentClass

がありましたので、削除しました。(2002/01/27)