wxPython--學習筆記

pythontab發表於2013-03-07

wxPython程式由兩個必要的物件組成,應用物件APP和頂級視窗物件Frame

應用程式物件APP管理主事件迴圈MainLoop()

頂級視窗物件Frame管理資料,控制並呈現給使用者

先看一段最簡單的程式碼:

import wx
class App(wx.App):
     
    def OnInit(self):
        frame = wx.Frame(parent = None, title = "Kobe")
        frame.Show()
        return True
app = App()
app.MainLoop()

上面的程式碼說明了開發wxPython程式必須的5個步驟:

1. 匯入wxPython包

2. 子類化wxPython應用類

3. 定義應用程式的初始化方法

4. 建立一個應用程式類的例項

5. 進入這個應用程式的主事件迴圈(MainLoop())

OnInit()方法沒有引數,返回值為BOOL,此部分可以做一些關鍵資料初始化的動作,如果失敗,返回False,程式退出。通常會在此方法中建立一個Frame物件,並呼叫Frame的Show()方法。

應用程式物件開始於例項被建立時,結束於最後一個應用程式視窗被關閉,與Python指令碼開始執行沒有先後關係。

每個wxPython程式必須有一個application物件和至少一個frame物件。application物件必須是wx.App的一個例項或在OnInit()方法中定義的一個子類的一個例項,當程式啟動時,OnInit()方法將被wx.App父類呼叫。

上面的程式碼中,定義了名為MyApp的子類,在OnInit()方法中建立frame物件。

wx.Frame(self, parent, id, title, pos, size, style, name)

其中,只有parent是必須的,其餘都有預設值,返回值為空。下面是其各個引數的型別:

parent (type=Window)
id    (type=int)
pos      (type=Point)
size    (type=Size)
style  (type=long)
name   (type=String)
Returns: bool

呼叫Show()方法使frame可見,否則不可見。可以透過給Show一個布林值引數來設定frame的可見性:

frame.Show(False)    # 框架不可見
frame.Show(True)     # 框架可見
frame.Hide()         # 等同於frame.Show(False)

該程式並沒有定義一個__init__()方法,意味著父方法wx.App.__init()__將在物件建立時被自動呼叫。若自己定義__init__()方法,還需要呼叫其基類的__init__()方法。

class App(wx.APP):
    def __init__(self):
        wx.APP.__init__(self)

如果沒有這樣做, wxPython將不被初始化,並且OnInit()方法也不會呼叫

當程式進入主迴圈後,控制權將轉交給wxPython。wxPython GUI程式主要響應使用者的滑鼠和鍵盤事件。當一個應用程式的所有框架被關閉後,app.MainLoop()方法將返回,程式退出。

import wx
class Frame(wx.Frame):
     
    def __init__(self, image, parent=None, id =-1,
                 pos = wx.DefaultPosition, 
                 title = "Hello, wxPython!"):
         
        temp = image.ConvertToBitmap()
        size = temp.GetWidth(), temp.GetHeight()
         
        wx.Frame.__init__(self, parent, id, title, pos, size)
        self.bmp = wx.StaticBitmap(parent = self, bitmap = temp)
class App(wx.App):
     
    def OnInit(self):
        image = wx.Image('wxPython.jpg', wx.BITMAP_TYPE_JPEG)
        self.frame = Frame(image)
         
        self.frame.Show()
        self.SetTopWindow(self.frame)
        return True
def main():
    app = App()
    app.MainLoop()
if __name__ == '__main__':
    main()