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

第4回 speakwin モジュールを書く(3)/メニュー


このページの目次

ボタンをデフォルトに
メニューを見てみましょう
ここまでのまとめ


ボタンをデフォルトに

Win クラスにもう少し手を入れます。
Speak ボタンを縁取りしてデフォルトにし、 return キーと enter キーで動作するようにしてみます。

speakwin.py
----------------------------------------------
import W

class Win(W.Window):
  #メインウィンドウのクラス
  def __init__(self):
    #ウィンドウを表示
    W.Window.__init__(self, (10, 40, 250, 180), 'SpeakText', 
        fontsettings = ('Osaka',0,12,(0,0,0)))
    
    self.prompttext = W.TextBox((10,10,50,22), text = 'Input:')
    self.text = W.EditText((60,10,140,22))
    self.speakbutton = W.Button((90, 60, 60, 22), title = 'Speak', 
        callback = self.speak)
    
    self.open()
    
    self.setdefaultbutton(self.speakbutton) #<-加えた
    
  def speak(self):
    import macspeech
    macspeech.SpeakString(self.text.get())
----------------------------------------------

WウィジェットリファレンスのWindowWindow クラスにある setdefaultbutton([button = None, *keys]) というメソッドを使います。
上のように self.speakbutton を設定すると、ボタンが縁取りされます。return キーまたは enter キーを押すと、マウスでSpeak ボタンを押したのと同じように色が反転し、話します。

self.setdefaultbutton(self.speakbutton) の代わりに
self.setdefaultbutton(self.speakbutton, "cmds")
とすると、コマンドキー+ s で Speak ボタンが押されます。このとき return キーを押すと、テキスト入力フィールドが改行してしまいます。
『"cmds" のようなキーを指定しない場合には、デフォルトで return キーと enter キーの両方がボタンに設定される』ということだと思います。

コマンドキー+ s は "cmds" で表します。このへんのことはWジェットリファレンスのバインディングにあります。
return キーのように特殊なキーを指定するには Python:Mac:Tools:IDE:Wkeys.py ファイルに設定されている変数を使うといいと思います。

また、self.setdefaultbutton(self.speakbutton) の代わりに
self.bind("cmds", self.speakbutton.push)
とすると、self.speakbutton の縁取りはされませんが、コマンドキー+ s で Speak ボタンが押されます。

ここまでできたものを実行すると(くどいようですが、speakwin.py を Python インタープリタで実行するのではなく、MyApp.py を実行するんですよ)、以下のようになります。

デフォルトボタン付のウィンドウ

ひとつ注意点ですが、コマンドキー+ s はすでに File メニューの Save アイテムの実行に設定されています。このような場合は、前面にアクティブになっているウィンドウで設定されているコマンドキー+ s の操作が優先されるので、Speak ボタンが実行されるようです。

メニューを見てみましょう

MyApp.py を実行してみると、File、Edit メニューができています。これらは MyApp.py が作ってくれています。Edit メニューのコピー、ペーストなどの各アイテムは他のアプリケーションのものと同じように働きます。便利ですね。

アプリケーションのテンプレート(ひな形)として、MyApp.py は便利でしょ?

File メニューには、New、Open... などがあります。New は、Corran Webstar さんの 「Using W Widgets」の MyApp.py のまま MyDocumentClass を開くようになっています。しかし、このモジュールを MyApp.py の中で import していないので、実行するとエラーになります。

そこで、New、Open... などのアイテムは、今作っているアプリケーションには不要なので削除しましょう。これから先は MyApp.py ファイルを編集します。

 
MyApp.py
変更前:112-118
----------------------------------------------
    newitem = FrameWork.MenuItem(m, "New", "N", 'new')
    openitem = FrameWork.MenuItem(m, "Openノ", "O", 'open')
    FrameWork.Separator(m)
    closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
    saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
    saveasitem = FrameWork.MenuItem(m, "Save asノ", None, 'save_as')
    FrameWork.Separator(m)
----------------------------------------------
変更後:112-118
----------------------------------------------
    #newitem = FrameWork.MenuItem(m, "New", "N", 'new')
    #openitem = FrameWork.MenuItem(m, "Openノ", "O", 'open')
    #FrameWork.Separator(m)
    #closeitem = FrameWork.MenuItem(m, "Close", "W", 'close')
    #saveitem = FrameWork.MenuItem(m, "Save", "S", 'save')
    #saveasitem = FrameWork.MenuItem(m, "Save asノ", None, 'save_as')
    #FrameWork.Separator(m)
----------------------------------------------

File メニューの部分です。上のようにして Quit だけ残して他をコメントアウトしました。

このように Close、Save、Save as... メニューアイテムを削除したら、以下も訂正しなければなりません。そうしないと、「closeitem がありません」というエラーが出てしまいます。

 
MyApp.py
変更前:137-139
----------------------------------------------
    self._menustocheck = [closeitem, saveitem, saveasitem,
      undoitem, cutitem, copyitem, pasteitem, 
      clearitem, selallitem]
----------------------------------------------
変更後:137-139
----------------------------------------------
    self._menustocheck = [
      undoitem, cutitem, copyitem, pasteitem, 
      clearitem, selallitem]
----------------------------------------------

この self._menustocheck は、enable(選択実行可能)にしたり、disable(灰色で表示されて選択実行不可能)にするかどうか判断が必要なメニューアイテムを設定しています。closeitem などを削除してしまったので、 self._menustocheck からも削除しなければならないわけです。

以上で不要なメニューアイテムは無くなりました。

Open、New などのメニューアイテムは domenu_open、domenu_new などのメソッドを呼び出していました。メニューアイテムを削除してしまったので、対応するメソッドも削除していいのですが、あとで加えたりする場合を考えて私は残しておいています。

ついでに以下の部分もコメントアウトで削除します。

MyApp.py
変更前:95-97
----------------------------------------------
    import sys
    for path in sys.argv[1:]:
      self.opendoc(path)
----------------------------------------------
変更後:95-97
----------------------------------------------
    #import sys
    #for path in sys.argv[1:]:
    #  self.opendoc(path)
----------------------------------------------

これは、アプレットにした時に sys.args を開く操作をしているところです。テキストエディタのようなアプリケーションなら、『ファイルをアプリケーションにドロップして起動したら、アプリケーションでそのファイルを開く』という場合に使うのですが、今作っているアプリケーションでは不要なので、とりあえず「#」でコメントアウトしました。

ここまでのまとめ

ここまでの MyApp.py と speakwin.py、そして MyApp.rsrc を一つのフォルダに入れた speak.sit.bin(約 30k)を作りました。

File メニューから Close アイテムを削除しましたが、ウィンドウ左上のクローズボックスをクリックするとウィンドウが閉じます。もう一度開くことはできず、アプリケーションを終了することしかできません。次回はウィンドウをクローズするとアプリケーションも終了するようにします。


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

by ©Hioryuki Yoshimura, 2002-2004.
Last modified at 2004/1/28