从字符串加载XRC

时间:2012-06-22 14:02:17

标签: wxpython

我想从一些外部数据源动态创建GUI。源将显示其内部结构,例如字段,包括数据类型,初始值,最小值等,以及可由(远程)数据对象处理的一些操作。应该将结构转换为文本控件和按钮,应该动态地从GUI添加和删除。 这非常像使用XRC加载GUI的一部分,所以我想知道我是否应该使用XRC或自己编写代码。使用XRC可以更轻松地测试和使用替代数据源。生成XRC相当容易。所以现在我有以下两个问题:

  1. 这个想法有其他选择吗?
  2. 我找不到从字符串加载XRC的方法,因为xrc.XmlResource只接受文件名作为参数。使用临时文件似乎很乱,所以任何想法如何从字符串加载?

2 个答案:

答案 0 :(得分:0)

经过实验后,看起来XmlResource需要一个文件或类文件对象。我不知道为什么你不能只使用一些文件,但是如果你想避免这种情况,那么你可以通过创建类似文件的对象来实现。请参阅StringIO或http://pypi.python.org/pypi/filelike/0.3.3/

答案 1 :(得分:0)

你需要这样称呼它:

        res = wx.xrc.EmptyXmlResource() #Here it is
        res.LoadFromString(resourceText)

这是一个例子。

import wx, wx.xrc

resourceText = '''<?xml version="1.0" encoding="UTF-8"?>
 <resource>

<object class="wxPanel" name="MyPanel">
  <object class="wxStaticText">
    <size>80,-1</size>
    <label>Hey</label>
  </object>
 </object>
</resource>
'''


class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, 'Testing',
                          size=(640,480))

        res = wx.xrc.EmptyXmlResource() #Here it is
        res.LoadFromString(resourceText)

        panel = res.LoadPanel(self, "MyPanel")
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel, 1, wx.EXPAND|wx.ALL, 5)

        self.SetSizer(sizer)
        self.SetAutoLayout(True)


if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = TestFrame(None)
    frame.Show(True)
    app.MainLoop()