続・XRCedで生成されたソースについて

なんかジェネレートされたPythonファイルはいらないような気がしてきた。

Gladeと同じようにXMLを読み込むところからコーディングしても別に手間じゃないし、自分で書いたソースの方が読みやすい。
シンプルなFrameならxrcファイルとAppクラスだけでいける。

import sys
import wx
import wx.xrc as xrc

print "aoiso start"
print __name__

class AoisoApp(wx.App):

    def OnInit(self):
        self.res = xrc.XmlResource('aoisome.xrc')
        self.init_frame()
        return True

    def init_frame(self):
        self.frame = self.res.LoadFrame(None, 'MainFrame')
        self.frame.Bind(wx.EVT_MENU, self.OnFileNewClick, id=xrc.XRCID('FILE_NEW'))
        self.frame.SetSize((700,500))
        self.frame.SetPosition((200,200))
        self.frame.Show()

    def OnFileNewClick(self, event):
        print "file_new"


if __name__ == "__main__":
    print "Execute AOISO"
    app = AoisoApp(False)
    app.MainLoop()

MainFrameをちゃんと宣言してメソッドを追加したりしたい場合は、こんな感じ。

import sys
import wx
import wx.xrc as xrc

print "aoiso start"
print __name__

class MainFrame(wx.Frame):
    def __init__(self, app, parent=None):
        pre = wx.PreFrame()
        app.res.LoadOnFrame(pre, parent, "MainFrame")
        self.PostCreate(pre)
        self.Bind(wx.EVT_MENU, app.OnFileNewClick, id=xrc.XRCID('FILE_NEW'))
        self.SetSize((700,500))
        self.SetPosition((200,200))

class AoisoApp(wx.App):

    def OnInit(self):
        self.res = xrc.XmlResource('aoisome.xrc')
        self.frame = MainFrame(self)
        self.frame.Show()
        return True

    def OnFileNewClick(self, event):
        print "file_new"


if __name__ == "__main__":
    print "Execute AOISO"
    app = AoisoApp(False)
    app.MainLoop()

最初はFrameの引数parentにApp自身を渡してやればいいのではと思ったのですが、parentは本来そういうものではないので、LoadOnFrameのparentにNoneを渡したりとトリッキーな記述が必要になります。ここでは__init__の引数を増やしました。

あと、分かってしまえばなんということはないのですが、イベントが取れなくてちょっとハマりました。MenuやToolBarのイベントはEVT_BUTTONではなくEVT_MENUなんですね。

ここまでコミットしました(Rev.23)。