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すれば良い、と。