wxPython學習筆記(二)


如何創建和使用一個應用程序對象?

任何wxPython應用程序都需要一個應用程序對象。這個應用程序對象必須是類wx.App或其定制的子類的一個實例。應用程序對象的主要目的是管理幕后的主事件循環。

父類wx.App也定義了一些屬性,它們對整個應用程序是全局性的。

創建一個wx.App的子類

四個步驟:

1、定義這個子類 2、在定義的子類中寫一個OnInit()方法 3、在你的程序的主要部分創建這個類的一個實例 4、調用應用程序實例的MainLoop()方法。這個方法將程序的控制權轉交給wxPython

由於OnInit()方法的存在,並且它是wxPython架構的一部分,所以任何關於你的定制的類的所需的初始化通常都由OnInit()方法管理,而不在Python__init__方法中。如果由於某些原因你決定需要__init__方法,那么你必須在你的__init__方法中調用父類的__init__方法,如下所示:

wx.App.__init__(self)

通常,你OnInit()方法中將至少創建一個框架對象,並調用該框架的Show()方法。你也可以有選擇地通過調用SetTopWindow()方法來為應用程序指定一個框架作為頂級窗口。頂級窗口被作為那些沒有指定父窗口的對話框的默認父窗口。

何時省略wx.App的子類

沒有必要創建你自己的wx.App子類,你通常想這樣做是為了能夠在OnInit()方法中創建你的頂級框架。 通常,如果在系統中只有一個框架的話,避免創建一個wx.App子類是一個好的主意。

 

理解應用程序對象的生命周期

你的wxPython應用程序對象的生命周期開始於應用程序實例被創建時,在最后一個應用程序窗口被關閉時結束。這個沒有必要與你的wxPython應用程序所在的Python腳本的開始和結束相對應。Python腳本可以在wxPython應用程序創建之前選擇做一動作,並可以在wxPython應用程序的MainLoop()退出后做一些清理工作。然而所有的wxPython動作必須在應用程序對象的生命周期中執行。正如我們曾提到過的,這意味你的主框架對象在wx.App對象被創建之前不能被創建。(這就是為什么我們建議在OnInit()方法中創建頂級框架——因為這樣一來,就確保了這個應用程序已經存在。)

下圖所示,創建應用程序對象觸發OnInit()方法並允許新的窗口對象被創建。在OnInit()之后,這個腳本調用MainLoop()方法,通知wxPython事件現在正在被處理。在窗口被關閉之前應用程序繼續它的事件處理。當所有頂級窗口被關閉后,MainLoop()函數返回同時應用程序對象被注銷。這之后,這個腳本能夠關閉其它的可能存在的連接或線程。

如何定向wxPython程序的輸出?

未學習

如何關閉wxPython應用程序?

當你的應用程序的最后的頂級窗口被用戶關閉時,wxPython應用程序就退出了。我們這里所說的頂層窗口是指任何沒有父親的框架,並不只是使用SetTopWindow()方法設計的框架。

管理正常的關閉

管理緊急關閉

以上未學習

如何創建和使用頂級窗口對象?

在你的應用程序中一個頂級窗口對象是一個窗口部件(通常是一個框架),它不被別的窗口部件所包含。頂級窗口對象通常是你的應用程序的主窗口,它包含用戶與之交互的窗口部件和界面對象。當所有的頂級窗口被關閉時應用程序退出。

你的應用程序至少必須有一個頂級窗口對象。頂級窗口對象通常是wx.Frame的子類,盡管它也可以是wx.Dialog的子類。大多數情況下,你將為了使用為你的應用程序定義定制的wx.Frame的子類。然而,這兒也存在一定數量的預定義的wx.Dialog的子類,它們提供了許多你可能會在一個應用程序中遇到的典型的對話框。

這兒可能有一個名稱上的混淆,那就是“頂級窗口”。一般意義上的頂級窗口是指在你的應用程序中任何沒有父容器的窗口部件。你的應用程序必須至少有一個,但是,只要你喜歡可以有多個。但是它們中只有一個可以通過使用SetTopWindow()wxPython作為主頂級窗口。如果你沒有使用SetTopWindow()指定主頂級窗口,那么在wx.App的頂級窗口列表中的第一個框架將被認為是這個主頂級窗口。一個應用程序一次只能有一主頂級窗口

使用wx.Frame

按照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號是所有窗口部件的特征。在一個wxPython應用程序中,每個窗口部件都有一個窗口標識。在每一個框架內,ID號必須是唯一的,但是在框架之間你可以重用ID號。然而,我們建議你在你的整個應用程序中保持ID號的唯一性,以防止處理事件時產生錯誤和混淆。在wxPython中也有一些標准的預定義的ID號,它們有特定的意思(例如,wx.ID_OKwx.ID_CANCEL是對話框中的OKCancel按鈕的ID號)。在你的應用程序中重用標准的ID號一般沒什么問題,只要你在預期的方式中使用它們。在wxPython中,ID號的最重要的用處是在指定的對象發生的事件和響應該事件的回調函數之間建立唯一的關聯。

三種方法來創建一個窗口部件使用的ID號:

1、明確地給構造器傳遞一個正的整數 2、使用wx.NewId()函數 3、傳遞一個全局常量wx.ID_ANY-1給窗口部件的構造器

使用wx.Size和wx.Point

在你的應用程序中當一個wx.Pointwx.Size實例被要求的時候(例如在另一個對象的構造器中),你不必顯式地創建這個實例。你可以傳遞一個元組給構造器,wxPython將隱含地創建這個wx.Pointwx.Size實例:

frame = wx.Frame(None, -1, pos=(10, 10), size=(100, 100))

使用wx.Frame的樣式

每個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的對象來管理子窗口的復雜布局。

給框架增加菜單欄、工具欄和狀態欄。

未學習

如何使用一般的對話框?

1、消息對話框

2、文本輸入對話框

如果你想從用戶那里得到單獨一行文本,你可能使用類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()

 

3、從一個列表中選擇

你可以讓用戶只能從你所提供的列表中選擇,你可以使用類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()返回實際所選的字符串。

總結

  1. wxPython程序的實現基於兩個必要的對象:應用程序對象和頂級窗口。任何wxPython應用程序都需要去實例化一個wx.App,並且至少有一個頂級窗口

  2. 應用程序對象包含OnInit()方法,它在啟動時被調用。在這個方法中,通常要初始化框架和別的全局對象。wxPython應用程序通常在它的所有的頂級窗口被關閉或主事件循環退出時結束。

  3. 應用程序對象也控制wxPython文本輸出的位置。默認情況下,wxPython重定向stdoutstderr到一個特定的窗口。這個行為使得診斷啟動時產生的錯誤變得困難了。但是我們可以通過讓wxPython把錯誤消息發送到一個文件或控制台窗口來解決。

  4. 一個wxPython應用程序通常至少有一個wx.Frame的子類。一個wx.Frame對象可以使用style參數來創建組合的樣式。每個wxWidget對象,包括框架,都有一個ID,這個ID可以被應用程序顯式地賦值或由wxPython生成。子窗口是框架的內容,框架是它的雙親。通常,一個框架包含一個單一的wx.Panel,更多的子窗口被放置在這個Panel。框架的唯一的子窗口的尺寸自動隨其父框架的尺寸的改變而改變。框架有明確的關於管理菜單欄、工具欄和狀態欄的機制。

  5. 盡管你將使用框架做任何復雜的事情,但當你想簡單而快速地得到來自用戶的信息時,你可以給用戶顯示一個標准的對話窗口。對於很多任務都有標准的對話框,包括警告框、簡單的文本輸入框和列表選擇框等等。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM