wxPythonとXRCとAUIの関係
ドッカブルウインドウってwxでできるんだろうか? と調べていて、wxAUIほにゃららというやつを使えばできることを知りました。早速wxPythonでやってみる。
test1.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import wx import wx.aui class MyFrame(wx.Frame): def __init__(self, title, pos, size): wx.Frame.__init__(self, None, -1, title, pos, size) self.auimgr = wx.aui.AuiManager(self) txtctrl1 = wx.TextCtrl(self, -1, "Hello",wx.DefaultPosition, wx.Size(200,200),wx.TE_MULTILINE) txtctrl2 = wx.TextCtrl(self, -1, "World",wx.DefaultPosition, wx.Size(200,200),wx.TE_MULTILINE) self.auimgr.AddPane(txtctrl1,wx.LEFT, "hello") self.auimgr.AddPane(txtctrl2,wx.BOTTOM, "world") self.auimgr.Update() def OnQuit(self, event): self.Cose() if __name__ == '__main__': app = wx.App() frame = MyFrame("test",wx.DefaultPosition,wx.Size(300,300)) frame.Show() app.MainLoop()
案外簡単。
ところが、aoisoではGUI編集をXRCedでやってますので、上記のようなGUI直書きではありません。調べてみるとXRCedにはAUI関係のコントロールは用意されていない様子。ということはカスタムウィジェットのようにunknownを使ってやるのか・・・と思いきや、unknownはコンテナには使えないらしい。じゃぁどうするんだ、ということでいろいろ試してみたら何のことはない。以下のようにできました。
test2.py
#!/usr/bin/python # -*- coding: UTF-8 -*- import wx import wx.xrc as xrc import wx.aui class MyApp(wx.App): def OnInit(self): self.res = xrc.XmlResource("test2.xrc") self.frame = MyFrame(self) self.frame.Show() return True class MyFrame(wx.Frame): def __init__(self, app): pre = wx.PreFrame() app.res.LoadOnFrame(pre, None, "ID_FRAME_1") self.PostCreate(pre) self.auimgr = wx.aui.AuiManager(self) self.text1 = xrc.XRCCTRL(self,"ID_TEXT_1") self.text2 = xrc.XRCCTRL(self,"ID_TEXT_2") self.auimgr.AddPane(self.text1,wx.LEFT,"hello") self.auimgr.AddPane(self.text2,wx.BOTTOM,"world") self.auimgr.Update() if __name__ == "__main__": app = MyApp(False) app.MainLoop()
test2.xrc
<?xml version="1.0" ?> <resource> <object class="wxFrame" name="ID_FRAME_1"> <object class="wxTextCtrl" name="ID_TEXT_1"> <style>wxTE_MULTILINE</style> </object> <object class="wxTextCtrl" name="ID_TEXT_2"> <style>wxTE_MULTILINE</style> </object> </object> </resource>
要するに、XRC上はFrameに直置きして、実行時にaddPaneすれば良い、と。