創建最小的空的wxPython程序
import wx #1 class App(wx.App):#2 def OnInit(self): #3 frame = wx.Frame(parent=None, title='Bare') frame.Show() return True app = App() #4 app.MainLoop() #5
上面的代碼的任何一行都不能少,否則將不能工作。這個基本的wxPython程序說明了開發任一wxPython程序所必須的五個基本步驟:
-
導入必須的wxPython包
一旦你導入了wx模塊,你就能夠創建你的應用程序(application)對象和框架(frame)對象。每個wxPython程序必須有一個application對象和至少一個frame對象。application對象必須是wx.App的一個實例或你在OnInit()方法中定義的一個子類的一個實例。當你的應用程序啟動的時候,OnInit()方法將被wx.App父類調用。 -
子類化wxPython應用程序類wx.App
我們通常在OnInit()方法中創建frame對象。上面的wx.Frame接受三個參數,僅第一個(parent=None)是必須的,其余的都有默認值。 調用Show()方法使frame可見,否則不可見。我們可以通過給Show()一個布爾值參數來設定frame的可見性 - 定義一個應用程序的初始化方法
我們沒有為我們的應用程序類定義一個__init__()方法。在Python中,這就意味着父方法wx.App.__init()__將在對象創建時被自動調用。這是一個好的事情。如果你定義你自己的__init__()方法,不要忘了調用其基類的__init()__方法,如:
class App(wx.App): def __init__(self): wx.App.__init__(self)
如果你忘了這樣做,wxPython將不被初始化並且你的OnInit()方法也將得不到調用。
- 創建一個應用程序類的實例
- 進入這個應用程序的主事件循環
一旦進入主事件循環,控制權將轉交給wxPython。wxPythonGUI程序主要響應用戶的鼠標和鍵盤事件。當一個應用程序的所有框架被關閉后,這個app.MainLoop()方法將返回且程序退出。
擴展這個最小的空的wxPython程序
import wx class Frame(wx.Frame): #3 pass class App(wx.App): def OnInit(self): self.frame = Frame(parent=None, title='Spare') #4 self.frame.Show() self.frame.Center() self.SetTopWindow(self.frame) #5 return True if __name__ == '__main__': #6 app = App() app.MainLoop()
- 我們改變了創建frame對象的方法。bare版的程序簡單地創建了一個wx.Frame類的實例。在spare版中,我們定義了我們自己的Frame類作為wx.Frame的子類。此時,最終的結果沒有什么不同,但是如果你想在你的框架中顯示諸如文本、按鈕、菜單的話,你可能就想要你自己的Frame類了。
- 我們將對frame實例的引用作為應用程序實例的一個屬性
-
在OnInit()方法中,我們調用了這個App類自己的SetTopWindow()方法,並傳遞給它我們新創建的frame實例。我們不必定義SetTopWindow()方法,因為它繼承自wx.App父類。SetTopWindow()方法是一個可選的方法,它讓wxPython方法知道哪個框架或對話框將被認為是主要的。一個wxPython程序可以有幾個框架,其中有一個是被設計為應用程序的頂級窗口的。
-
這個是Python中通常用來測試該模塊是作為程序獨立運行還是被另一模塊所導入。我們通過檢查該模塊的__name__屬性來實現
創建最終的hello.py程序
import wx class Frame(wx.Frame): #2 wx.Frame子類 """Frame class that displays an image.""" def __init__(self, image, parent=None, id=-1, pos=wx.DefaultPosition, title='Hello, wxPython!'): #3圖像參數 """Create a Frame instance and display image.""" #4 顯示圖像 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): #5 wx.App子類 """Application class.""" def OnInit(self): #6 圖像處理 image = wx.Image('back_image.jpg', wx.BITMAP_TYPE_JPEG) self.frame = Frame(image) self.frame.Show() self.SetTopWindow(self.frame) return True def main(): #7 app = App() app.MainLoop() if __name__ == '__main__': main()
#2 定義一個wx.Frame的子類,以便我們更容量控制框架的內容和外觀。
#3 給我們的框架的構造器增加一個圖像參數。這個值通過我們的應用程序類在創建一個框架的實例時提供。同樣,我們可以傳遞必要的值給wx.Frame.__init__()
#4 我們將用wx.StaticBitmap控件來顯示這個圖像,它要求一個位圖。所以我們轉換圖像到位圖。我們也使用圖像的寬度和高度創建一個size元組。這個size元組被提供給wx.Frame.__init__()調用,以便於框架的尺寸匹配位圖尺寸。
#5 定義一個帶有OnInit()方法的wx.App的子類,這是wxPython應用程序最基本的要求。
#6 我們使用與hello.py在同一目錄下的名為wxPython.jpg的文件創建了一個圖像對象。
#7 main()函數創建一個應用程序的實例並啟動wxPython的事件循環。
