查看文章
 
GUI programming with wxPython 之 XRC(1)
2008年06月02日 星期一 23:28

一、概念

XRC(XML Resource)的设计来源于wxWidgets,它的想法很简单,就是将界面设计的工作从程序中独立出来。具体的做法是,创建单独的XML文件,负责界面设计,程序运行的时候载入,生成界面。这样做的好处是显而易见的。首先,将繁琐的外观设计代码从程序中去掉,程序更清晰易读。其次,XRC文件独立于程序,程序运行时才调用,因此可以随意更换外观。这种思想并不是wxWidgets的原创,MFC中的RC已经有了,类似的还有HTML和CSS的关系。wxPython从wxWidgets继承而来,当然也保留了XRC。

这里有几点要补充的。一是wxPython的XRC文件中用到的类名称仍然是wxWidgets中的类名称,换句话说,wxPython和wxWidgets可以共用XRC文件,第二点要补充的是XRC文件可以编译成二进制文件XRS,或者编译成C++代码。

二、例子

先来看一个例子。

import wx

class MyFrame(wx.Frame):

    def __init__(self):

        wx.Frame.__init__(self, parent=None, id=wx.ID_ANY, title='My Frame')

        panel = wx.Panel(self)

        label1 = wx.StaticText(panel, wx.ID_ANY, 'First name:')

        label2 = wx.StaticText(panel, wx.ID_ANY, 'Last name:')

        self.text1 = wx.TextCtrl(panel, wx.ID_ANY)

        self.text2 = wx.TextCtrl(panel, wx.ID_ANY)

        button = wx.Button(panel, wx.ID_ANY, 'Submit')

        sizer = wx.FlexGridSizer(rows=2, cols=2, vgap=5, hgap=5)

        self.Bind(wx.EVT_BUTTON, self.OnSubmit, button)

        sizer.Add(label1)

        sizer.Add(self.text1)

        sizer.Add(label2)

        sizer.Add(self.text2)

        sizer.Add((0,0)) #filler for the grid cell

        sizer.Add(button)

        panel.SetSizer(sizer)

        sizer.Fit(self)

    def OnSubmit(self, evt):

        wx.MessageBox('Your name is %s %s!' %

(self.text1.GetValue(), self.text2.GetValue()), 'Feedback')

class MyApp(wx.App):

    def OnInit(self):

        frame = MyFrame()

        self.SetTopWindow(frame)

        frame.Show()

        return True

if __name__ == '__main__':

    app = MyApp(False)

    app.MainLoop()

这是一个简单的wxPython程序。可以看到上面的代码中,除了BindOnSubmit,其他的代码都是和界面设计有关的,这些代码或者类似的代码出现于几乎所有的GUI程序中。下面是用XRC重新实现的代码。

import wx

from wx import xrc

class MyApp(wx.App):

    def OnInit(self):

        self.res = xrc.XmlResource('gui.xrc')

        self.init_frame()

        return True

    def init_frame(self):

        self.frame = self.res.LoadFrame(None, 'mainFrame')

        self.panel = xrc.XRCCTRL(self.frame, 'panel')

        self.text1 = xrc.XRCCTRL(self.panel, 'text1')

        self.text2 = xrc.XRCCTRL(self.panel, 'text2')

        self.frame.Bind(wx.EVT_BUTTON, self.OnSubmit, id=xrc.XRCID('button'))

        self.frame.Show()

    def OnSubmit(self, evt):

        wx.MessageBox('Your name is %s %s!' %

(self.text1.GetValue(), self.text2.GetValue()), 'Feedback')

if __name__ == '__main__':

    app = MyApp(False)

    app.MainLoop()

看起来是不是比上面的清晰多了,当然,程序要跑起来,还需要下面的部分。下面的代码属于XRC文件。


类别:编程技术||添加到搜藏 |分享到i贴吧|浏览(1632)|评论 (0)
 
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
     

   
帮助中心 | 空间客服 | 投诉中心 | 空间协议
©2012 Baidu