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

第13回 リストボックスの項目を追加する


このページの目次

まえがき
Add ボタンを作る
ここで不具合を発見
Delete ボタンを作る
まとめ


まえがき

リストボックスの項目には、コード自体に書いた『Hello!, again』だけしか表示されていません。それに加えることができるようにします。新たにボタンを設け、ボタンを押すとテキストボックスに書いた内容をリストボックスに加えるようにします。

Add ボタンを作る

ウィンドウにボタンを加えて、それを押すとリストボックスの項目に加えるようにします。

前回までのspeak9.sit.bin(約 30k)に書き加えていきます。

speakwin.py
変更前:20-28
----------------------------------------------
  self.speakbutton = W.Button((90, -32, 60, 22), title = 'Speak', 
      callback = self.speak)

  self.text = ['Hello!, again']
  self.listbox = W.List((20,120,200,140), items = self.text, 
      callback = self.settext)
  
  self.open()
  
  self.bind("cmds", self.speakbutton.push)
  self.text = ['Hello!, again']

----------------------------------------------
変更後:
----------------------------------------------
  self.speakbutton = W.Button((90, -32, 60, 22), title = 'Speak', 
      callback = self.speak)
  
  self.addbutton = W.Button((90, 90, 60, 22), title = 'Add', 
      callback = self.addList)  #追記
  
  self.text = ['Hello!, again']
  self.listbox = W.List((20,120,200,140), items = self.text, 
      callback = self.settext)
  
  self.open()
  
  self.bind("cmds", self.speakbutton.push)
  self.bind("cmdd", self.addbutton.push)  #追記
----------------------------------------------

self.addbutton = W.Button((90, 90, 60, 22), title = 'Add', callback = self.addList)

ボタンを加えています。「Add」というラベルがついて、押すと self.addList メソッドが実行される、としました。テキスト入力フィールドとの間がちょっと狭くなってしまいました。

self.bind("cmdd", self.addbutton.push)

短縮キーも設定しました。コマンド+D で押されます。

次に、「Add」ボタンを押すと呼び出される addList メソッドを書きます。

speakwin.py
変更後:『def settext(self, event):』の定義のあとに追記
----------------------------------------------
 def addList(self):
  self.text.append(self.textaria.editor.get())
  self.listbox.set(self.text)
----------------------------------------------

self.text.append(self.textaria.editor.get())

テキストボックスの内容を取り出して(self.textaria.editor.get())それをリスト self.text に追加 append します。

self.listbox.set(self.text)

項目を追加された self.text を新たにリストボックス self.listbox にセットします。

W.List 自身も __getitem__、__setitem__、 __delitem__、__getslice__、 __selslice__、__len__、append、 remove、index、insert の各メソッドを持っているので、
def addList(self):
 self.listbox.append(self.textaria.editor.get())
と、しても同様に働きます。

以上のようにして spekawin.py を保存して MyApp.py を実行し、「Add」ボタンを押すと、以下のようになります。

テキストボックスからリストボックスへ

ここで不具合を発見

テキストボックスに『Hello』と入力して、「Add」ボタンを押すとリストボックスに加えられますが、リストボックスに表示される『Hello』とフォントが違っています。

テキストボックスからリストボックスへ

日本語の『こんにちは』を入力してリストボックスに加えてみると、やっぱり違います。

日本語をテキストボックスに入力してリストボックスへ

リストボックスに fontsettings の設定はできないので、ウィンドウの fontsettings が使われるはずです。ウィンドウの fontsettings で Osaka を指定してるのに、リストボックスに日本語がちゃんと表示されていない、ということです。

19行目で self.textaria.editor で設定している fontsettings を削除したりしましたが、改善ませんでした。

これは、13行目の
self.prompttext = W.TextBox((10,10, 50, 22), text = 'Input:')

self.prompttext = W.TextBox((10,10, 50, 22), text = 'Input:', fontsettings = ('Osaka',0,12,(0,0,0)))
とすると、うまくいきます。

日本語をテキストボックスに入力してリストボックスへ

ボタンのラベルのフォントも Osaka になりました。ウィンドウの fontsettings がどこまで及ぶか、わからないのですが、他のアイテム(ここでは TextBox)でも fontsettings をしておかないと、途中で変わってしまうんでしょうか?

Delete ボタンを作る

リストボックスに増やしていくだけではなく、削除もできるようにしたいです。削除ボタンを作って、リストボックス内の選択した項目を削除するようにします。

speakwin.py
変更前:22
----------------------------------------------
  self.addbutton = W.Button((90, 95, 60, 22), title = 'Add', 
    callback = self.addList)
----------------------------------------------
変更後:22-
----------------------------------------------
  self.addbutton = W.Button((90, 95, 60, 22), title = 'Add', 
    callback = self.addList)
  self.deletebutton = W.Button((160, 95, 60, 22), title = 'Delete', 
    callback = self.delList)  #追記
   ・
   ・
   ・
  self.bind("cmds", self.speakbutton.push)
  self.bind("cmdd", self.addbutton.push)
  self.bind("cmde", self.deletebutton.push)  #追記
----------------------------------------------

「Delete」ボタンを作りました。コマンドキー+E の短縮キーを割り当てました。

次に、「Delete」ボタンを押すと呼び出される delList メソッドを書きます。

speakwin.py
変更後:『def addList(self):』の定義のあとに追記
----------------------------------------------
 def delList(self):
  selecteditem = self.listbox.getselection()
  text = self.text[:]
  for i in selecteditem:
   self.text.remove(text[i])
  self.listbox.set(self.text)
----------------------------------------------

def delList(self):
 selecteditem = self.listbox.getselection()

self.listbox.getselection() で選択された項目の添字からなるリスト(例えば [0]、[1])を返します。それを selecteditem に代入します。

text = self.text[:]

self.text の内容を text にコピーして、text を作業用に使います。text = self.text だと、単に参照になってしまいます。

for i in selecteditem:
 self.text.remove(text[i])

選択された項目について、その内容(text[i])を self.text から削除します。これだと、同じ項目があったら最初のものを削除するだけなので順番が狂ってしまいますが、これで勘弁して下さい。

self.listbox.set(self.text)

削除して更新した self.text をリストボックスにセットします。

以上のようにして spekawin.py を保存して MyApp.py を実行すると、以下のようになります。

テキストボックスからリストボックスへ

まとめ

以上の結果をまとめた speak10.sit.bin(約 30k)を作りました。

次回はリストボックスの内容を保存したりして、起動時にそれを読み込んだりしてみます。

何か誤りやご質問、お気付きの点、ご意見やご不満などございましたら、メールで、もしくはMacPython BBS(よ)へ書き込んでいただければ幸いです。


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

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