查看文章 |
一、概念 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程序。可以看到上面的代码中,除了Bind和OnSubmit,其他的代码都是和界面设计有关的,这些代码或者类似的代码出现于几乎所有的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文件。 |

