続・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)。