任何wxPython應用程序都須要一個應用程序對象。這個應用程序對象必須是類wx.App或其定製的子類的一個實例。應用程序對象的主要目的是管理幕後的主事件循環。架構
父類wx.App也定義了一些屬性,它們對整個應用程序是全局性的。app
四個步驟:框架
一、定義這個子類 二、在定義的子類中寫一個OnInit()方法 三、在你的程序的主要部分建立這個類的一個實例 四、調用應用程序實例的MainLoop()方法。這個方法將程序的控制權轉交給wxPython函數
因爲OnInit()方法的存在,而且它是wxPython架構的一部分,因此任何關於你的定製的類的所需的初始化一般都由OnInit()方法管理,而不在Python的__init__方法中。若是因爲某些緣由你決定須要__init__方法,那麼你必須在你的__init__方法中調用父類的__init__方法,以下所示:工具
wx.App.__init__(self)
一般,你在OnInit()方法中將至少建立一個框架對象,並調用該框架的Show()方法。你也能夠有選擇地經過調用SetTopWindow()方法來爲應用程序指定一個框架做爲頂級窗口。頂級窗口被做爲那些沒有指定父窗口的對話框的默認父窗口。oop
你沒有必要建立你本身的wx.App子類,你一般想這樣作是爲了可以在OnInit()方法中建立你的頂級框架。 一般,若是在系統中只有一個框架的話,避免建立一個wx.App子類是一個好的主意。佈局
你的wxPython應用程序對象的生命週期開始於應用程序實例被建立時,在最後一個應用程序窗口被關閉時結束。這個沒有必要與你的wxPython應用程序所在的Python腳本的開始和結束相對應。Python腳本能夠在wxPython應用程序建立以前選擇作一動做,並能夠在wxPython應用程序的MainLoop()退出後作一些清理工做。然而全部的wxPython動做必須在應用程序對象的生命週期中執行。正如咱們曾提到過的,這意味你的主框架對象在wx.App對象被建立以前不能被建立。(這就是爲何咱們建議在OnInit()方法中建立頂級框架——由於這樣一來,就確保了這個應用程序已經存在。)學習
下圖所示,建立應用程序對象觸發OnInit()方法並容許新的窗口對象被建立。在OnInit()以後,這個腳本調用MainLoop()方法,通知wxPython事件如今正在被處理。在窗口被關閉以前應用程序繼續它的事件處理。當全部頂級窗口被關閉後,MainLoop()函數返回同時應用程序對象被註銷。這以後,這個腳本可以關閉其它的可能存在的鏈接或線程。spa
(未學習)線程
當你的應用程序的最後的頂級窗口被用戶關閉時,wxPython應用程序就退出了。咱們這裏所說的頂層窗口是指任何沒有父親的框架,並不僅是使用SetTopWindow()方法設計的框架。
(以上未學習)
在你的應用程序中一個頂級窗口對象是一個窗口部件(一般是一個框架),它不被別的窗口部件所包含。頂級窗口對象一般是你的應用程序的主窗口,它包含用戶與之交互的窗口部件和界面對象。當全部的頂級窗口被關閉時應用程序退出。
你的應用程序至少必須有一個頂級窗口對象。頂級窗口對象一般是類wx.Frame的子類,儘管它也能夠是wx.Dialog的子類。大多數狀況下,你將爲了使用爲你的應用程序定義定製的wx.Frame的子類。然而,這兒也存在必定數量的預約義的wx.Dialog的子類,它們提供了許多你可能會在一個應用程序中遇到的典型的對話框。
這兒可能有一個名稱上的混淆,那就是「頂級窗口」。通常意義上的頂級窗口是指在你的應用程序中任何沒有父容器的窗口部件。你的應用程序必須至少有一個,可是,只要你喜歡能夠有多個。可是它們中只有一個能夠經過使用SetTopWindow()被wxPython做爲主頂級窗口。若是你沒有使用SetTopWindow()指定主頂級窗口,那麼在wx.App的頂級窗口列表中的第一個框架將被認爲是這個主頂級窗口。一個應用程序一次只能有一主頂級窗口。
按照wxPython中的說法,框架就是用戶一般稱的窗口。那就是說,框架是一個容器,用戶能夠將它在屏幕上任意移動,並可將它縮放,它一般包含諸如標題欄、菜單等等。在wxPython中,wx.Frame是全部框架的父類。這裏也有少數專用的wx.Frame子類,你可使用它們。
當你建立wx.Frame的子類時,你的類應該調用其父類的構造器wx.Frame.__init__()。wx.Frame的構造器所要求的參數以下:
wx.Frame(parent, id=-1, title="", pos=wx.DefaultPosition, size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE, name="frame")
參數的說明以下:
parent:框架的父窗口。對於頂級窗口,這個值是None。框架隨其父窗口的銷燬而銷燬。取決於平臺,框架可被限制只出如今父窗口的頂部。在多文檔界面的狀況下,子窗口被限制爲只能在父窗口中移動和縮放。
id:關於新窗口的wxPython ID號。你能夠明確地傳遞一個。或傳遞-1,這將致使wxPython自動生成一個新的ID。
title:窗口的標題。
pos:一個wx.Point對象,它指定這個新窗口的左上角在屏幕中的位置。在圖形用戶界面程序中,一般(0,0)是顯示器的左上角。這個默認的(-1,-1)將讓系統決定窗口的位置。
size:一個wx.Size對象,它指定這個窗口的初始尺寸。這個默認的(-1,-1)將讓系統決定窗口的初始尺寸。
style:指定窗口類型的常量。你可使用或運算來組合它們。
name:框架的內在的名字。之後你可使用它來尋找這個窗口。
記住,這些參數將被傳遞給父類的構造器方法:wx.Frame.__init__()。
建立wx.Frame子類的方法以下所示:
class MyFrame(wx.Frame): def __init__(self): wx.Frame.__init__(self, None, -1, "My Friendly Window", (100, 100), (100, 100))
在wxPython中,ID號是全部窗口部件的特徵。在一個wxPython應用程序中,每一個窗口部件都有一個窗口標識。在每個框架內,ID號必須是惟一的,可是在框架之間你能夠重用ID號。然而,咱們建議你在你的整個應用程序中保持ID號的惟一性,以防止處理事件時產生錯誤和混淆。在wxPython中也有一些標準的預約義的ID號,它們有特定的意思(例如,wx.ID_OK和wx.ID_CANCEL是對話框中的OK和Cancel按鈕的ID號)。在你的應用程序中重用標準的ID號通常沒什麼問題,只要你在預期的方式中使用它們。在wxPython中,ID號的最重要的用處是在指定的對象發生的事件和響應該事件的回調函數之間創建惟一的關聯。
有三種方法來建立一個窗口部件使用的ID號:
一、明確地給構造器傳遞一個正的整數 二、使用wx.NewId()函數 三、傳遞一個全局常量wx.ID_ANY或-1給窗口部件的構造器
在你的應用程序中當一個wx.Point或wx.Size實例被要求的時候(例如在另外一個對象的構造器中),你沒必要顯式地建立這個實例。你能夠傳遞一個元組給構造器,wxPython將隱含地建立這個wx.Point或wx.Size實例:
frame = wx.Frame(None, -1, pos=(10, 10), size=(100, 100))
每一個wxPython窗口部件都要求一個樣式參數。
wx.DEFAULT_FRAME_STYLE樣式被定義爲以下幾個基本樣式的組合:
wx.MAXIMIZE_BOX | wx.MINIMIZE_BOX | wx.RESIZE_BORDER |wx.SYSTEM_MENU | wx.CAPTION | wx.CLOSE_BOX
要從一個合成的樣式中去掉個別的樣式,你可使用^操做符。例如要建立一個默認樣式的窗口,但要求用戶不能縮放和改變窗口的尺寸,你能夠這樣作:
wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX |wx.MAXIMIZE_BOX)
# 當點擊close按鈕時,這個窗口將關閉且應用程序將退出。 import wx class InsertFrame(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Frame With Button', size=(300, 100)) panel = wx.Panel(self) #建立畫板 button = wx.Button(panel, label="Close", pos=(125, 10), size=(50, 50)) #將按鈕添加到畫板 #綁定按鈕的單擊事件 self.Bind(wx.EVT_BUTTON, self.OnCloseMe, button) #綁定窗口的關閉事件 self.Bind(wx.EVT_CLOSE, self.OnCloseWindow) def OnCloseMe(self, event): self.Close(True) def OnCloseWindow(self, event): self.Destroy() if __name__ == '__main__': app = wx.App() frame = InsertFrame(parent=None, id=-1) frame.Show() app.MainLoop()
類InsertFrame的方法__init__建立了兩個子窗口。第一個是wx.Panel,它是其它窗口的容器,它自身也有一點功能。第二個是wx.Button,它是一個日常按鈕。接下來,按鈕的單擊事件和窗口的關閉事件被綁定到了相應的函數,當事件發生時這相應的函數將被調用執行。
大多數狀況下,你將建立一個與你的wx.Frame大小同樣的wx.Panel實例以容納你的框架上的全部的內容。這樣作可讓定製的窗口內容與其餘如工具欄和狀態欄分開。 經過tab按鈕,能夠遍歷wx.Panel中的元素,wx.Frame不能。在wxPython中,你只需在子窗口被建立時指定父窗口,這個子窗口就隱式地增長到父對象中了。
你可能想知道,爲何wx.Button被建立時使用了明確的位置和尺寸,而wx.Panel沒有。在wxPython中,若是只有一個子窗口的框架被建立,那麼那個子窗口被自動從新調整尺寸去填滿該框架的客戶區域。這個自動調整尺寸將覆蓋關於這個子窗口的任何位置和尺寸信息,但僅適用於框架內或對話框內的只有惟一元素的狀況。這裏按鈕是panel的元素,而不是框架的,因此要使用指定的尺寸和位置。若是沒有爲這個按鈕指定尺寸和位置,它將使用默認的位置(panel的左上角)和基於按鈕標籤的長度的尺寸。
顯式地指定全部子窗口的位置和尺寸是十分乏味的。更重要的是,當用戶調整窗口大小的時候,這使得子窗口的位置和大小不能做相應調整。爲了解決這兩個問題,wxPython使用了稱爲sizers的對象來管理子窗口的複雜佈局。
(未學習)
一、消息對話框
二、文本輸入對話框
若是你想從用戶那裏獲得單獨一行文本,你可能使用類wx.TextEntryDialog。下面的片段建立了一個文本輸入域,當用戶單擊OK按鈕退出時,得到用戶輸入的值:
dlg = wx.TextEntryDialog(None, "Who is buried in Grant's tomb?", 'A Question', 'Cary Grant') if dlg.ShowModal() == wx.ID_OK: response = dlg.GetValue()
三、從一個列表中選擇
你可讓用戶只能從你所提供的列表中選擇,你可使用類wx.SingleChoiceDialog。下面是一個簡單的用法:
dlg = wx.SingleChoiceDialog(None, 'What version of Python are you using?', 'Single Choice', ['1.5.2', '2.0', '2.1.3', '2.2', '2.3.1'], if dlg.ShowModal() == wx.ID_OK: response = dlg.GetStringSelection()
wx.SingleChoiceDialog的參數相似於文本輸入對話框,只是以字符串的列表代替了默認的字符串文本。要獲得所選擇的結果有兩種方法,GetSelection()方法返回用戶選項的索引,而GetStringSelection()返回實際所選的字符串。
wxPython程序的實現基於兩個必要的對象:應用程序對象和頂級窗口。任何wxPython應用程序都須要去實例化一個wx.App,而且至少有一個頂級窗口。
應用程序對象包含OnInit()方法,它在啓動時被調用。在這個方法中,一般要初始化框架和別的全局對象。wxPython應用程序一般在它的全部的頂級窗口被關閉或主事件循環退出時結束。
應用程序對象也控制wxPython文本輸出的位置。默認狀況下,wxPython重定向stdout和stderr到一個特定的窗口。這個行爲使得診斷啓動時產生的錯誤變得困難了。可是咱們能夠經過讓wxPython把錯誤消息發送到一個文件或控制檯窗口來解決。
一個wxPython應用程序一般至少有一個wx.Frame的子類。一個wx.Frame對象可使用style參數來建立組合的樣式。每一個wxWidget對象,包括框架,都有一個ID,這個ID能夠被應用程序顯式地賦值或由wxPython生成。子窗口是框架的內容,框架是它的雙親。一般,一個框架包含一個單一的wx.Panel,更多的子窗口被放置在這個Panel中。框架的惟一的子窗口的尺寸自動隨其父框架的尺寸的改變而改變。框架有明確的關於管理菜單欄、工具欄和狀態欄的機制。