ListBox は 1 つあるいはそれ以上の文字列のリストを表示、マウスで選択するときに使用するウィジェットです。しかし単純な文字列のリストではなく、インスタンスのリストを使いたい場合があります。例えばあるファイル・オブジェクト(インスタンス)の一覧を ListBox へ表示する場合などです。
JavaFX の ListView では、比較的簡単にインスタンスのリストを表示することができたのですが、wxPython の wx.ListBox では同じようには出来なかったので、少し調べたところ、やり方は異なるものの、やりたいことが実現できることが判りました [1]。
ということで、備忘録として簡単なサンプルを作りました。都道府県クラス PrefObj のインスタンスを ListBox のアイテムに追加しています。ListBox のアイテムには文字列の name プロパティを表示し、マウスのクリックイベントで message プロパティをステータスバーに表示しています。マウスのクリックイベントだけでは、PrefObj のインスタンスを取得できなかったので別の方法でインスタンスを取得しています。
動作環境は次の通りです。
- OS: Fedora 24 (x86_64, Beta)
- python-2.7.11-4.fc24.x86_64
- wxPython-3.0.2.0-10.fc24.x86_64
- IDE: eclipse-pydev-4.6.0-1.fc24.x86_64
# -*- coding: utf-8 -*- import wx class MyFrame(wx.Frame): def __init__(self, parent): wx.Frame.__init__(self, parent, title=u"都道府県リスト", size=(250, 200)) self.CreateStatusBar() self.create_listbox() def create_listbox(self): self.lbox = wx.ListBox(self, wx.ID_ANY) self.lbox.Bind(wx.EVT_LISTBOX, self.listbox_select) elem_01 = PrefObj(u"北海道", u"札幌市") self.lbox.Append(elem_01.name, elem_01) elem_02 = PrefObj(u"青森県", u"青森市") self.lbox.Append(elem_02.name, elem_02) elem_03 = PrefObj(u"岩手県", u"盛岡市") self.lbox.Append(elem_03.name, elem_03) def listbox_select(self, event): obj1 = event.GetEventObject() obj2 = self.lbox.GetClientData(self.lbox.GetSelection()) self.SetStatusText(obj1.GetStringSelection() + u"の県庁所在地は" + obj2.message + u"です。") class PrefObj(): def __init__(self, name, message): self.name = name self.message = message class MyApp(wx.App): def OnInit(self): ui = MyFrame(None) ui.Show(True) return True if __name__ == "__main__": app = MyApp(False) app.MainLoop()
実行例を以下に示しました。
まだまだ初心者ですが、Python でプログラミングをするようになってから不思議な感覚にとらわれています。インデントが構文規則に含まれていることで、不思議なコーディングの美しさというものを感じるようになってきたからです。今のところ、JavaFX で作っているアプリケーションを、wxPython に置き換えたらパフォーマンスがどのぐらい変化するかを評価するために四苦八苦しながら移植していますが、もしも(対象のアプリケーションについて)wxPython のパフォーマンスの方が良ければ、ひょっとすると JavaFX を使わなくなってしまうかもしれません。
参考サイト
にほんブログ村
0 件のコメント:
コメントを投稿