作者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
→ rexrainbow:我是用wxGlade來做gui的雛形 08/27 18:56
→ StubbornLin:那個我也用過 太陽春 不好用 試試WxFB 超讚 XD 08/27 20:05
→ rexrainbow:thx 我試試看 08/27 20:45
推 guteres:可以用Boa來做看看 08/28 12:22
→ guteres:算是蠻完整的wxpython IDE 08/28 12:22