wxPython布局管理器(sizer)學習(1)


個人認為學習GUI程序開發,最重要的兩個基礎點就是:事件處理和界面布局。事件處理能夠讓你在界面上的控件被鼠標、按鍵等觸發的時候做出合適的響應,比如點擊“保存”按鈕之后彈出標准的文件保存對話框。另外一件重要的就是界面的布局,之所以要有GUI程序,就是為了有良好的用戶體驗,如果一個軟件界面布局亂七八糟的話,肯定是不合適的。至於按鈕、文本框、靜態文本這些組件,不過是通過相應的類產生實例並用Add之類的方法添加到面板上而已。

wxPython的sizer是用於自動布局一組窗口(之前提到過GUI程序開發中窗口的概念,一個按鈕、一個文本框都叫窗口(window),而軟件的主體結構,通常為矩形,我們稱之為框架(Frame))的算法。使用sizer的好處是當容器(一個Frame或Panel)的尺寸被用戶調整時,容器內的組件會自動重新計算最優化的大小和位置,不用像絕對定位那樣為每一個組件設計大小和位置。sizer的缺陷也很明顯,那就是有一定的局限性,因為sizer的類型是有限的,在布局上不能像絕對定位那樣隨心所欲。需要注意的是,sizer本身並不是容器,只是一種算法,把組件添加到某個sizer,實際上是說這個組件用這個sizer來計算它該如何布局,而實際上組件的容器還是一個Frame或者Panel。

wxPython中預定義的sizer

  • Grid: 最基礎的二維網格布局,可以指定行列,每個網格的尺寸都相同。
  • Flex grid:在Grid的基礎上進行了改進,網格的尺寸可以不同。
  • Grid bag:最靈活的網格布局器,可以隨意放置在網格中放置組件。
  • Box:在一條水平線或垂直線上進行布局,網格的尺寸可以不同,通常用於嵌套。
  • Static box:標准的box sizer,一圈環線上可以帶有文本標題。

 使用sizer的基本步驟

  1. 創建sizer並使用SetSizer(sizer)方法將它關聯到容器。例如:panel.SetSizer(mySizer)。
  2. 使用Add()方法將有關組件添加至sizer。如:mySizer.Add(saveBtn)。
  3. (可選)用Fit()方法使sizer能夠計算它的尺寸。如:mySizer.Fit(panel),這個方法會使sizer根據容器內的組件計算它自己應該有多大才能容納下這些組件,並且把這部分組件的父窗口(容器)調整為合適的大小。還有個FitInside()方法,它不調整父窗口大小。

Grid sizer

下圖所示,是一個最基本的Grid sizer,每個組件的尺寸相同,整齊排列在二維網格中。

Grid sizer的構造函數:

wx.GridSizer(rows, cols, vgap, hgap)

這個函數中,rows和cols指定行列數量,vgap和hgap分別指定控件之間的垂直和水平間隔。這四個屬性都有各自的set*和get*方法來設置或獲取值。GetRows(), SetRows(rows), GetCols(), SetCols(cols)......

Grid sizer的每個網格尺寸都是相同的,其大小是根據所放置的最大控件來計算。

為sizer添加控件

首先要明白,添加控件到sizer中的次序是非常重要的。在Grid sizer中,你所添加的控件會從左至右,從上到下地添加到網格中。

添加控件到網格的最常用方法是Add()方法,它有如下三種重載形式:

  1. Add(window, proportion=0, flag=0, border=0, userData=None)
  2. Add(sizer, proportion=0, flag=0, border=0, userData=None)
  3. Add(size, proportion=0, flag=0, border=0, userData=None)

第一種形式最常用,將窗口控件添加到sizer。第二種形式是把一個子sizer添加到父sizer,用於嵌套布局。第三個是添加一個size大小的空白到sizer,通常用於在控件之間添加空白符。

proportion參數只在box sizer中才有效。flag標記用於控制對齊方式等。如果flag參數指定了邊框,就需要用border參數指定邊框寬度。userData用於傳遞額外數據,往往自定義sizer時需要使用。

 除了Add()方法之外,還有Insert()方法,它可以通過index參數將控件、sizer或size添加到sizer的任意位置,有如下三種形式:

  1. Insert(index, window, proportion=0, flag=0, border=0, userData=None)
  2. Insert(index, sizer, proportion=0, flag=0, border=0, userData=None)
  3. Insert(index, size, proportion=0, flag=0, border=0, userData=None)

 Prepend()方法,用於將控件、sizer、size添加到sizer的第一個位置,參數與Add方法一樣。

 從sizer中移除控件,可以使用Detach()方法,參數可以是window、sizer、index。


免責聲明!

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



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