作者StubbornLin (Victor)
看板Python
标题[心得] 最近玩wxPython的心得
时间Wed Aug 27 14:41:26 2008
这几天在写GUI
用的是wxPython,之前一直没碰过wxWidget的玩意儿
这次第一次玩,没想到已经成长到这种地步了
比我想像中的还来得丰富和好用太多了
该有的全都很齐全,而且都很好用,更重要的是全都是跨平台的
还是原生的介面
相较之下MFC像是跛脚的老太婆
要什麽没什麽 囧 不能跨平台
上手也很快,一开始,我所有介面都是用程式码生成
当视窗渐渐扩张,我发现我在折磨我自己= =
这很痛苦,用程式写介面
"当一样东西一直改变、不停的改变,表示他们必需成为资料而非程式码"
这是我最近学到的心得,於是我就想这样的东西应该是要和程式码分离的才对
然後就开始寻找设计GUI的IDE,在我试遍了各种五花八门的GUI
不是简单过度,不然就是很难用
最後我找到两款最好用的
http://www.anthemion.co.uk/dialogblocks/
一款是DialogBlocks,这是商业软体
展示版有限制,例如一个Window最多只能有30个元素
一开始我只找到这个,为了这个该死的限制我把视窗拆成好几个部份
然後再用程式把它们组合起来
http://wxformbuilder.org/
最後,我终於找到合我胃口的软体
Open source的 wxFormBuilder,几乎该有的都有
感觉和DialogBlocks很类似,而且没有该死的限制
很看好这一套
不过,他们产生的程式码都是C++,所以我用另一种方式来组合我的wxPython
使用XRC
XRC是wxWidget的资源档格式,GUI可以用这种档案来表示,而wxWidget也有提供方式
来载入这些XRC档
res = xrc.XmlResource(os.path.join('xrc', 'frames.xrc'))
这样就可以载入xrc档
接着是载入Frame或Dialog之类的
self.mainFrame = self.res.LoadFrame(parent, 'mainFrame')
还有载入某个Frame里的control
applyChangeButton = xrc.XRCCTRL(self.mainFrame, 'applyChangeButton')
这样一来介面设计的工作就可以从程式码里抽离开来
然而,LoadXXXX是载入整个window的instance,如果你想继承它,这就是个问题
为此wxPython提供一种二阶段载入的方式来处理这个问题
class View(wx.Frame, ViewBase):
def __init__(self, parent, res=None):
self.res = res or xrc.XmlResource(os.path.join('xrc', 'frames.xrc'))
pre = wx.PreFrame()
self.res.LoadOnFrame(pre, parent, 'mainFrame')
self.PostCreate(pre)
用LoadOnXXXX配合PreXXXX和PostCreate的方式来载入xrc
上面提到的资料都可以在wxPython的wiki里找到
如你所见我用的是MVC的架构来写我的GUI,虽然事件要手动绑有些脑人
不过至少已经比全手动轻松了很多,wxPython感觉很不错
用起来很顺手 赞 :D
以上
--
财报分析王
http://victorlin.serveftp.org/stock/
程式设计教学
http://victorlin.serveftp.org/programming/
VICTOR工作室
http://www.kinmen.info/vic/
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.116.64.211
1F:→ rexrainbow:我是用wxGlade来做gui的雏形 08/27 18:56
2F:→ StubbornLin:那个我也用过 太阳春 不好用 试试WxFB 超赞 XD 08/27 20:05
3F:→ rexrainbow:thx 我试试看 08/27 20:45
4F:推 guteres:可以用Boa来做看看 08/28 12:22
5F:→ guteres:算是蛮完整的wxpython IDE 08/28 12:22
6F:推 huggie:资源档的观念是什麽? 09/13 15:40
7F:→ huggie:GUI code 可以建立成资源档再读近来? 09/13 15:40
8F:推 ewn:是建立成xml描述gui的档案,类似.net的xaml 09/14 11:18