2016-05-19

【備忘録】CheckListBox のアイテムにインスタンスを追加 ─ wxPython

JavaFX で作っていたプログラムでリソース不足 (OutOfMemoryError) に悩まされているため、結局同じことになるかもしれないと思いつつも、軽快に GUI が動く wxPython にプログラムを移植しており、python のプログラミングに不慣れなためハマった個所を備忘録としてブログ用のサンプルに書き換えて残しています。

今回は CheckListBox です。ListBox のアイテムにインスタンスを追加するために紹介したサンプル [1] をベースに、Web で見つけた CheckListBox のサンプルのコード [2] を参考にさせていただきました。

動作環境は次の通りです。

  • 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.CheckListBox(self, wx.ID_ANY)
        self.lbox.Bind(wx.EVT_LISTBOX, self.SelectEvent)
        self.Bind(wx.EVT_CHECKLISTBOX, self.CheckEvent, self.lbox)

        elem_01 = PrefObj(u"北海道", u"札幌市")
        self.lbox.Append(elem_01.pref, elem_01)

        elem_02 = PrefObj(u"青森県", u"青森市")
        self.lbox.Append(elem_02.pref, elem_02)

        elem_03 = PrefObj(u"岩手県", u"盛岡市")
        self.lbox.Append(elem_03.pref, elem_03)

    def SelectEvent(self, event):
        obj1 = event.GetEventObject()
        obj2 = self.lbox.GetClientData(self.lbox.GetSelection())
        self.SetStatusText(obj1.GetStringSelection() + u"の県庁所在地は" + obj2.capital + u"です。")

    def CheckEvent(self, event):
        index = event.GetSelection()
        obj = self.lbox.GetClientData(index)
        if self.lbox.IsChecked(index):
            self.SetStatusText(obj.pref + u"が選択されました。")
        else:
            self.SetStatusText(obj.pref + u"が選択解除されました。")

class PrefObj():
    def __init__(self, pref, capital):
        self.pref = pref
        self.capital = capital

class MyApp(wx.App):
    def OnInit(self):
        ui = MyFrame(None)
        ui.Show(True)
        return True

if __name__ == "__main__":
    app = MyApp(False)
    app.MainLoop()

実行例を以下に示しました。リストのアイテムを選択した時のバインディング self.lbox.Bind(wx.EVT_LISTBOX, self.SelectEvent) と、チェックボックスをチェックするときのイベント self.Bind(wx.EVT_CHECKLISTBOX, self.CheckEvent, self.lbox) の両方を実装しているため、予期せぬメッセージがステータスバーに表示される場合があります。

Windows 7 上で同じサンプルを確認しましたが、チェックボックスとアイテム選択のイベントを容易に区別できました。OS による動作の違いはおいおい詳しく確認していきます。

 

参考サイト

  1. bitWalk's: 【備忘録】ListBox のアイテムにインスタンスを追加 ─ wxPython
  2. wxPython/CheckListBox.py at master · wxWidgets/wxPython

 

ブログランキング・にほんブログ村へ
にほんブログ村

0 件のコメント: