wxPython GUI リソースエディタ XRCed

uyamae2008-03-06


XRCed は wxPython とともにインストールされます。きちんと wxPython インストール先の Python の pythonw.exe に拡張子 pyw が関連付けされていれば(普通はそうなっている*1)、スタートメニューから進んでいって XRC resource Editor というのを選ぶと起動してくれます。


XRCed は慣れるまではちょっと使いにくい*2ですが慣れればなかなか良いです。

wxPython では Sizer を用いてコントロールを配置していくとリサイズに対応した GUI が楽に作れます。XRCed でも Sizer を使ってコントロールを配置していくことが出来ます。

wxPython および XRCed を用いた開発についてはこちらのサイトを参考にさせていただいたり wx_utils.py を利用させていただいてます。

このどこかで見たような GUI を作るときに苦労した点を紹介します。

リストコントロール

wxListCtrl を配置すると GUI のテストが上手くいかずウィンドウが表示されませんでした。 Style の LC_REPORT にチェックを入れて、デフォルトの表示スタイルを指定すると上手くいきました。

最下部のボタンとチェックボックスの配置

まず領域を埋めるために wxEXPAND を指定した wxPanel を配置し、その中にさらに wxSHAPED|wxALIGN_CENTRE の wxPanel を配置しています。この二重構造にしない場合、背景色が濃い灰色になって見た目に違和感がありました。

ユーザ数表示と更新ボタン

隣との隙間を空けるために SizerItem の border を指定しています。ただしこれを有効にするためには flag に wxALL (もしくは wxLEFT, wxTOP, wxRIGHT, wxBOTTOM の各フラグ指定)を指定する必要があります。


wx_utils.py を利用するために、リソースファイルは resource.xrc の名前で保存します。

wx_utils.py を用いたアプリケーション

#coding: utf-8
import wx
import wx_utils
from wx_utils import XRC, XRCID, XRCCTRL

class MainFrame(wx.Frame):
    binder = wx_utils.bind_manager()
    
    def __init__(self, parent=None):
        pre = wx.PreFrame()
        XRC().LoadOnFrame(pre, parent, 'ID_MAIN_FRAME')
        self.PostCreate(pre)
        self.binder.bindall(self)
        # コントロールを取り出し
        ctrl=XRCCTRL(self, 'ID_LIST_USERS')
        # 行を追加
        ctrl.InsertColumn(0, 'ユーザ')
        ctrl.InsertColumn(1, 'グループ')
        ctrl.InsertColumn(2, 'ホスト')
        ctrl.InsertColumn(3, 'IPアドレス')

    @binder(wx.EVT_BUTTON, id=XRCID('ID_BTN_SEND'))
    def OnClickBtnSend(self, event):
        ctrl=XRCCTRL(self, 'ID_TEXT_MESSAGE')
        print ctrl.GetValue()

if __name__=='__main__':
    app = wx.App(False)
    wx_utils.XrcInit()
    frm = MainFrame()
    app.SetTopWindow(frm)
    frm.Show()
    app.MainLoop()

メインフレームの初期化時に、リストコントロールに対して列の要素を追加しています。送信ボタンを押したときには OnClickBtnSend が呼び出されて、テキストボックスの内容を標準出力に表示しています。

現在は py2exe による exe 化に挑戦中(ちょっと苦戦中)。

*1:しかし私の環境では複数のバージョンの Python をインストールしたりしなかったりしていたせいで py -> python 2.5, pyw -> python 2.4, wxPython -> python 2.5 となっていたため最初試したときは XRCed がちゃんと起動しなくて挫折した

*2:というより、 Sizer を用いて上手く配置するのが難しいです