wxpython - 基本用法和組件
wxpython是python對跨平台GUI庫wxWidgets的封裝。wxWidgets是由C++寫成的。
wxpython被包裝進了wx模塊中,用它設計GUI很方便,但是必須要做的就是先建立一個應用的對象:
app = wx.App() #與這個app相關的一些控件、框架等的操作,一定要在MainLoop調用前處理完 app.MainLoop()
為了書寫方便,下面所有代碼和文本中都默認了是from wx import *了,這樣不用每個類前面再加上wx.了。。。
*聽說是由於沿用了C++的習慣,所有wx中的方法和函數都是每個單詞的首字母大寫
■ 一些wx的類方法
wx.DisplaySize() 返回的是屏幕大小,如在窗口創建時指定size是這個的話創建出來的窗口就是最大化的
■ 窗口組件
● 窗口(Frame)類
所有控件都應該放到一個窗口里去展現,這個窗口類就是Frame類。他可以創建一個窗口並且右上角自帶最小化、最大化和關閉三個鍵。
其構造方法是 Frame(self, Window parent, int id=-1, String title=EmptyStrin,Point pos=DefaultPosition, Size size=DefaultSize,long style=DEFAULT_FRAME_STYLE, String name=FrameNameStr)z
各個參數的意思是:
parent 一個父對象,窗口的父對象只能是窗口。父對象的意思是當前對象和其關聯起來,當父對象被關閉或者刪除的話,當前對象也跟着一起不見了
、 id 指定一個id來在真個wx中標識當前對象。一般來說不用特別指定,可以寫默認值-1,意思是讓python自動分配一個id給他就好了。當事件發生時,python會根據這個id號來定位發生事件的元素
//以上兩個參數在所有控件類的構造方法里都有,且意思也都一樣。要記住喔
title 傳個字符串,讓窗口上面顯示這個title
pos 傳個元組,表示窗口被創建時出現在屏幕上的位置的坐標。左上角為原點
size 元組,表示窗口被創建時大小,可以
style 窗口的一些界面風格
name 給這個窗口起一個wx內部的名字,可以引用
Frame類有一些類方法:
Show() 顯示窗口
Hide() 隱藏窗口 //這兩個基本所有控件都有
Iconize() 最小化窗口
Close() 關閉窗口
SetMinSize(tuple) 設置窗口可調節的最小大小
SetMaxSize(tuple) 設置窗口可調節的最大大小
Center() 自動將窗口居屏幕正中顯示,這樣就可以不用設置構造方法里的pos屬性了
一般而言,不會直接調用Frame類來做文章,常見的最佳實踐是把需要的控件,事件處理方法等等封裝進一個自己定義的Frame類的子類。那么這樣一個子類其實抽象的就是一個個性化的窗口,比如:
class MyFrame(Frame): def __init__(self): Frame.__init__(self,None,-1,title="test",pos=(100,100),size=(200,200)) ''' 布局上的一些個性化添加和操作 ''' def someEventHandler(self,event): ''' 定義一些事件處理函數用於給控件Bind ''' pass if __name__ == "__main__": app = App() #創建應用的對象 myframe = MyFrame() #創建一個自定義出來的窗口 myframe.Show() #這兩句一定要在MainLoop開始之前就執行 app.MainLoop()
■ 面板組件 Panel
通常Panel是添加在Frame類上, panel = Panel(Frame,-1)
可以運用Panel來盛放其他組件,以實現對組件的分組管理。更加方便
在panel上,可以用SetBackgroundColour(...)來設置改變背景色,SetForegroundColour(...)設置前景顏色。
需要注意的一點是,Panel是有Size的。與窗口關聯的Panel,其大小默認為窗口的大小且具有EXPAND屬性,根據窗口大小改變而調整自身大小。而其他的Panel的默認大小是構造方法中的參數指定 or 由最后加進來多少組件決定。所以僅僅把某個沒和窗口關聯的Panel中的某個組件設置成EXPAND,而Panel本身不設置成EXPAND的話是沒有用的,因為窗口大小變化時,Panel本身大小不變。
■ 靜態文本 StaticText
構造方法:StaticText(parent,id,label,size,pos,style)
label就是要寫的字,可以用SetLabelText(...)設置文字,GetLabelText()來獲取文字。SetForegroundColour(...)來設置字的顏色,SetBackgroundColour(...)設置背景的顏色。
style可以設置如wx.ALIGN_CENTER這種,來讓文字居中對齊等等
■ 輸入框 TextCtrl
TextCtrl的構造方法和StaticText類似,其style可以選
TE_READONLY 設置輸入框只讀,不可編輯
TE_PASSWORD 輸入框中的輸入不顯示明文而顯示黑點
TE_MULTILINE 設置為多行文本輸入框
TextCtrl有如下類方法供調用:
AppendText(...),WriteText(...) 向輸入框末尾加上一些文本/向輸入框開頭加上一些文本
Clear() 清空文本框
GetValue(),SetValue(...) 獲取/設置文本值
GetRange(from,to) 返回兩位置中間的部分的字符串(參數是正整數,指第N個字符。開頭首個字符算0,算頭不算尾。比如HelloWorld.GetRange(2,4) == "ll")
Remove(from,to) 刪除兩個位置中間的部分的字符串
SetInsertionPoint(...),GetInsertionPoint() 將光標設置到第N個字符前面(首個字符算0的話)/獲得當前光標所在位置
■ 按鈕 Button
構造方法也是類似的,label參數指定了在按鈕上顯示的文本
類方法有:
SetLabel(...),GetLabel() 設置label,獲取label
SetDefault() 把按鈕設置為其所在窗口的默認按鈕,即按下按鈕之后和在這個窗口獲得焦點時敲回車是一個效果
● 圖片按鈕
可以用wx.Image來創建一個圖片對象,然后用一些方法把這張圖整合到button中就可以做成一個圖片按鈕:
pic = wx.Image("some_pic_path.png",wx.BITMAP_TYPE_BMP) #建立一個圖片對象,圖片最好是.png格式的。 pic.ConvertToBitMap() #將圖片格式轉換 btn = wx.BitmapButton(panel,-1,pic) #建立圖片按鈕