pywxrcがリニューアル

wxPythonにバンドルされているリソースコンパイラ

tags:python, gui, tips
created:2007-02-05T20:24:24

pywxrcは・・・もう使わなくなりましたね。

「pywxrc」とは

wxWidgetsでもwxPythonでも使える「Xmlリソースシステム」用リソースコンパイラです。

ヘルパーモジュールの紹介 でもすこし触れました。

Xmlリソースシステム用リソースであるXRCファイルを入力すると、 Pythonソースコードをジェネレートします。

digraph pywxrc1 {
pywxrc [shape=box]
"XRCファイル(*.xrc)" -> pywxrc
pywxrc -> "Pythonコード(*.py)"
}

pywxrcのブランチ

現時点で、1.9系と1.2系に分岐しています。 最近wxPython-demoに付属するものは1.9系になりました。

1.9系の特徴

pythonモジュール出力の際、XRC-IDが付与されている コントロールのインスタンスをメンバに加えるように ベースクラスを生成するようになりました。 ユーザーはベースクラスを継承してIDと同名のメンバで 各コントロールにアクセスできます。 また、イベントハンドリングも 継承先クラスに追記することで簡単にできます。 また、XRCedとの連携がサポートされています。

参考: http://wiki.wxpython.org/index.cgi/pywxrc

1.2系の特徴
モジュールへの形式変換以上のサポートはありません。

1.2系の問題点

1.2.2.0以前には Windows版においてバイナリファイルの取り扱いをしていないため、 画像ファイルの類がちゃんと取り込めないという問題がありました。

バグレポートを出したところ、 ちゃんと対応していただきました。

以前のやり方を利用する方は1.2.2.2を引き落として利用されると良いでしょう。

1.9系の問題点

利用してみたところ問題点が見つかりました。

メニューバーを設置するときメニューアイテムには当然IDを付与しますが、 リソースからメニューアイテムをベースクラスコンストラクタで取り出す コードが自動生成されるのですが、そのコードにはミスがあります。

pywxrc1.9の生成したコード:
class xrcMainFrame(wx.Frame):
    def PreCreate(self, pre):
        """ This function is called during the class's initialization.

        Override it for custom setup before the window is created usually to
        set additional window styles using SetWindowStyle() and SetExtraStyle()."""
        pass

    def __init__(self, parent):
        # Two stage creation (see http://wiki.wxpython.org/index.cgi/TwoStageCreation)
        pre = wx.PreFrame()
        self.PreCreate(pre)
        get_resources().LoadOnFrame(pre, parent, "MainFrame")
        self.PostCreate(pre)

        # Define variables for the controls
        self.MainMenubar = xrc.XRCCTRL(self, "MainMenubar")
        self.ID_EXIT = self.FindItemById(xrc.XRCID("ID_EXIT"))
        self.ID_ABOUT = self.FindItemById(xrc.XRCID("ID_ABOUT"))
        self.Splitter = xrc.XRCCTRL(self, "Splitter")
        self.TreeCtrl = xrc.XRCCTRL(self, "TreeCtrl")
        self.NoteBook = xrc.XRCCTRL(self, "NoteBook")

self(=wx.Frame)に「FindItemById」メソッド呼び出しをしていますが、 「wx.Frame」にメニューアイテム検索メソッドは備わっていません。

2007/2/10:
wxMenuBarをトップレベルにおいた場合の問題点とともに問題を修正しました。 修正箇所の一覧(annotate) をご覧ください。

使い方

オリジナルのpywxrc.pyは通常はここにあります:

C:\Python25\Lib\site-packages\wx-2.8-msw-unicode\wx\tools\pywxrc.py

こちらの pywxrc1.9(NoboNobo2007/2/10修正版)に差し替えてください。

所感

pywxrc1.9系はXRCedと連携するようになり、 保存をするだけでPythonコードをジェネレートするようにできますので、 リソース編集からテストランがスムーズになりました。

*.xrcファイルをxrcedに関連付けしたりすれば、 かなり軽快にGUIアプリ作成ができるようになりますよ!