2008年5月15日 星期四

簡單的wxPython程式

wxPythonwxWidgets(wxWindows)的Python版本.
wxWidgets是一個跨平台的視窗程式開發的library, 好處在於 :

  1. 開放原始碼
  2. 跨平台
  3. 大量的視窗元件可以使用
  4. 常用的功能也有函式庫支援
基於以上理由我選擇了wxPython做為Python視窗程式開發的library (注).

下面就以一個簡單的建立視窗的程式來講解一下wxPython建立視窗程式的運作.

# -*- coding: cp950 -*-
import wx

#建立視窗物件
class Frame(wx.Frame):
def __init__(self, parent, id, pos, title, size):
wx.Frame.__init__(self, parent, id, title, size)

#建立控制視窗的物件
class App(wx.App):
def OnInit(self):
self.frame = Frame(None, -1, wx.DefaultPosition,'視窗標題', (300,300))
self.frame.Show()
self.SetTopWindow(self.frame)
return True

#主程式
if __name__ == '__main__':
app = App()
app.MainLoop()

程式第一行的
# -*- coding: cp950 -*-
表示程式碼的編碼是用big5編碼, 如果沒有這一行註解裡面有中文會無法執行
程式用到的class
  1. Frame (繼承wx.Frame) : 建立一個視窗, __init__ 相當於C++裡面的constructor, 而self相當於傳入物件自己本身, 名字沒有限定要用self, 但是習慣上大家都是用self增加可讀性. __init__裡面呼叫Frame的parent的__init__ (constructor), 建立視窗.
  2. App : 利用Frame來產生視窗, 主要的控制都在App裡面完成, 包含設定視窗屬性, Event的控制等 等, 但是在這個簡單程式裡面沒有做Event的bind. 需要定義OnInit, OnInit會在產生App這個物件的Instance時被呼叫.
程式流程 :
  1. 建立App的Instance
  2. 建立Instance時, App裡面的OnInit被呼叫. 在OnInit中建立並且Show出Frame (視窗).
  3. app.MainLoop() 等待事件產生
簡單的說就是建立一個App物件利用Frame產生視窗, 並且在App物件中等待處理Event. 這就是wxPython的基本架構

(注) tk也有人推薦, 但是功能好像比較沒有這麼完整(視窗元件), 好處是容易學習.

參考資料 :
wxPython In Action翻譯
The wxPython tutorial
Gary的Blog

沒有留言: