作者:江南白衣 

    充分體驗(yàn)到知識(shí)循環(huán)再用的好處,原本對(duì)PythonwxWidgets沒有接觸的,天黑天亮之間,已經(jīng)作了一個(gè)半成品的桌面程序出來(lái)。

    1.選型
    通常選型之后,都會(huì)迫切的告訴別人自認(rèn)為正確的原因,這時(shí)候路過的人就比較不幸了。
    我選Python和wxWidgets,是因?yàn)?......

    因?yàn)槭前l(fā)布到網(wǎng)上的小程序,要它很小,Java和.Net這兩個(gè)還算當(dāng)紅但要裝虛擬機(jī)的笨家伙最先out了,而Python在py2exe之后壓成rar才3M,如果有心思還可以弄得更小。
    選wxWidgets是因?yàn)樗梢酝ㄐ杏赪indows,Linux兩個(gè)位面,另外Fox也能通用,不過wxWidgets是像SWT一樣用Native Widgets的,在WinXP上比較好看。
    用Python而不是C++,是為了快速開發(fā)。當(dāng)然,心底里其實(shí)是貪好玩。本來(lái)喜歡Ruby的語(yǔ)法更純潔一些,可惜wxRuby已經(jīng)太久沒更新了。

   2.wxWidgets
   所謂GUI框架,萬(wàn)變不離下面幾點(diǎn):
   1.框架結(jié)構(gòu)
      拿個(gè)HelloWorld一看就懂,又是Application->Frame->Menu 的標(biāo)準(zhǔn)架構(gòu)。

   2.wxWidgets用法
     來(lái)來(lái)去去還是Text框,選擇框,按鈕幾個(gè)老面孔,在wxPython上把wxPython2.6-win32-docs-demos-2.6.1.0.exe檔下載回來(lái),就有C++版本的API手冊(cè)與python版本的每個(gè)widgets的Demo Code。

   3.控件與頁(yè)面的Layout
      一種方式是C# Winform和Swing那樣在程序里生成組件和layout,經(jīng)歷過SWT手寫代碼畫頁(yè)面的折磨,再看到一層又一層的Container代碼(wxWidgets里是Sizer)已經(jīng)不覺得麻煩了。也有所見即所得的工具如BOA,不過畢竟沒有Visual Studio for WinForm那么好,難以真正使用。
      一種是像Delphi, VC或未來(lái)的XAML那樣把控件和layout記在XML文件里。但我沒有用。

  4.事件分發(fā)機(jī)制
     像 EVT_BUTTON(self,ID_UPLOAD, self.onUpload)這樣的代碼,挺簡(jiǎn)單的。

  可見,只要有過GUI編程的經(jīng)驗(yàn),再學(xué)wxWidgets 很容易。
  參考書:《Cross-Platform GUI Programming with wxWidgets》
                  《wxPython in Action》

   3. Python 
   手邊放一本Python的參考書,只要對(duì)動(dòng)態(tài)語(yǔ)言有點(diǎn)感性認(rèn)識(shí),對(duì)著Sample Code能能猜就猜,猜不到就拿chm版的參考書來(lái)索引,也很容易入門。

   最難的地方發(fā)生在遍歷目錄,那時(shí)候已經(jīng)有點(diǎn)困了:
for root, dirs, files in os.walk('C:/projects/'):
    
print sum(getsize(join(root, name)) for name in files)

    這是什么見鬼語(yǔ)法阿!!
    原來(lái)os.walk('C:/projects") 的返回值是一個(gè)tuple。在C++ Boost庫(kù)中接觸過這個(gè)概念,平常函數(shù)都只能返回一個(gè)值,而tuple可以讓你返回多個(gè)(這樣就不用利用傳址的參數(shù)來(lái)返回啦),所以就有了for root,dir,files in os.walk()這樣的句子。
    還有 print join(root,name) for name in files,原來(lái)python還有這種把閉包寫在for的前面的簡(jiǎn)寫法。

   IDE最后還是用了Eclipse的插件PyDev,畢竟Eclipse看著比較舒服,其他編輯器做得那么難看,怎么還好意思收錢。

4.美化界面  
    因?yàn)閣xWidgets用的是native widgets,不像Delphi,C# 和Swing有專門的look and feel 美化控件,所以美化的主要方式是為Toolbar和Button配上好看的圖標(biāo),還有修飾整個(gè)軟件的配色。
    推薦Tango一個(gè)圖標(biāo)庫(kù):http://tango-project.org/  to make open  source software beautiful...說(shuō)出了我的心聲啊,"頂尖兒的程序員必有完美主義藝術(shù)家之傾向。",目前的圖標(biāo)還不多,迅速更新中。