wxPython Button控件

在任何GUI界面按鈕組件的應用最爲廣泛。它捕獲用戶生成的點擊事件。其最明顯的用途是觸發綁定到一個處理函數。

wxPython類庫提供不同類型的按鈕。有一個簡單的、傳統的按鈕,wx.Button類對象帶有一些文本作爲其標題。 兩狀態的按鈕也可以,它被命名爲wx.ToggleButton。其按下或消沉狀態可通過事件處理程序函數來識別。

另一種類型的按鈕,wx.BitmapButton顯示位圖(圖片)作爲它的圖標。

構造wx.Button類和wx.ToggleButton類使用以下參數 -

Wx.Button(parent, id, label, pos, size, style)

這些是wx.Button類的一些重要方法-

S.N.

方法和說明

1

SetLabel()

編程設置按鈕的標題

2

GetLabel()

返回按鈕的標題

3

SetDefault()

按鈕設置爲默認頂層窗口。模擬click事件按下回車鍵

wx.ToggleButton類的兩種重要的方法是 -

S.N.

方法和說明

1

GetValue()

Returns the state of toggle button (on/off)

2

SetValue()

Sets the state of button programmatically

爲了創建位圖按鈕,首先,位圖對象需要被構建圖像文件出來。

wx.Bitmap類下面是最常用的構造函數 -

Wx.Bitmap(fiiename, wx.BITMAP_TYPE)

一些預定義的位圖類型常量是 -

wx.BITMAP_TYPE_BMP

wx.BITMAP_TYPE_ICO

wx.BITMAP_TYPE_CUR

wx.BITMAP_TYPE_TIFF

wx.BITMAP_TYPE_TIF

wx.BITMAP_TYPE_GIF

wx.BITMAP_TYPE_PNG

wx.BITMAP_TYPE_JPEG

wx.BITMAP_TYPE_PCX

wx.BITMAP_TYPE_ICON

wx.BITMAP_TYPE_ANY

位圖(bitmap)對象作爲參數wx.BitmapButton類的構造函數中的一個。

Wx.BitmapButton(parent, id, bitmap, pos, size, style) 

在某些操作系統平臺上,位圖按鈕可以顯示位圖和標籤。 SetLabel()方法用於指定標題。在其他平臺上,它作爲一個內部的標籤。正常的按鈕,以及位圖按鈕發出wx.CommandEvent。 EVT_BUTTON綁定器關聯一個函數來做處理。

另一方面切換按鈕使用wx.TOGGLEBUTTON綁定器來處理事件。

在下面的例子中,所有三種類型的按鈕被放置在面板的垂直框大小測定器。

使用語句創建簡單的按鈕對象 -

self.btn = wx.Button(panel, -1, "click Me")

切換按鈕使用下面的語句構造-

self.tbtn = wx.ToggleButton(panel , -1, "click to on")

這些按鈕加入到使用以下語句垂直大小測定器 -

vbox.Add(self.btn,0,wx.ALIGN_CENTER)
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)

注 - 由於wx.EXPAND標記時,切換按鈕佔據着幀的整個寬度。

使用EVT_BUTTON和EVT_TOGGLEBUTTON綁定器使它們各自相關聯處理程序。

self.btn.Bind(wx.EVT_BUTTON,self.OnClicked)
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)

三個位圖按鈕添加到一個橫向box大小測定器。這些按鈕顯示圖標,作爲它們的標題。

bmp = wx.Bitmap("NEW.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))

bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp1,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))

bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP_TYPE_BMP)
self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID_ANY, bitmap = bmp2,
size = (bmp.GetWidth()+10, bmp.GetHeight()+10))

這三個按鈕的點擊事件是針對OnClicked()方法。

self.bmpbtn.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn1.Bind(wx.EVT_BUTTON, self.OnClicked)
self.bmpbtn2.Bind(wx.EVT_BUTTON, self.OnClicked)

這些按鈕的內部標籤分別設置爲新建,打開和保存。

OnClicked()事件處理函數檢索源按鈕的標籤,從而導致click事件。這種標籤打印到控制檯上。

def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn

點擊切換按鈕時OnToggle()觸發事件處理程序。其狀態由GetValue()方法讀取,因此按鈕的標題被設置。

def OnToggle(self,event):
state = event.GetEventObject().GetValue()
if state == True:
print "off"
event.GetEventObject().SetLabel("click to off")
else:
print "on"
event.GetEventObject().SetLabel("click to on")

完整的代碼列表如下 -

import wx
class Mywin(wx.Frame):
def __init__(self, parent, title):
super(Mywin, self).__init__(parent, title = title,size = (200,150))
panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)

  self.btn = wx.Button(panel,-1,"click Me") 
  vbox.Add(self.btn,0,wx.ALIGN\_CENTER) 
  self.btn.Bind(wx.EVT\_BUTTON,self.OnClicked) 

  self.tbtn = wx.ToggleButton(panel , -1, "click to on") 
  vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN\_CENTER) 
  self.tbtn.Bind(wx.EVT\_TOGGLEBUTTON,self.OnToggle) 

  hbox = wx.BoxSizer(wx.HORIZONTAL) 

  bmp = wx.Bitmap("NEW.BMP", wx.BITMAP\_TYPE\_BMP) 
  self.bmpbtn = wx.BitmapButton(panel, id = wx.ID\_ANY, bitmap = bmp,
     size = (bmp.GetWidth()+10, bmp.GetHeight()+10)) 

  hbox.Add(self.bmpbtn,0,wx.ALIGN\_CENTER) 
  self.bmpbtn.Bind(wx.EVT\_BUTTON,self.OnClicked) 
  self.bmpbtn.SetLabel("NEW") 

  bmp1 = wx.Bitmap("OPEN.BMP", wx.BITMAP\_TYPE\_BMP) 
  self.bmpbtn1 = wx.BitmapButton(panel, id = wx.ID\_ANY, bitmap = bmp1,
     size = (bmp.GetWidth()+10, bmp.GetHeight()+10)) 

  hbox.Add(self.bmpbtn1,0,wx.ALIGN\_CENTER) 
  self.bmpbtn1.Bind(wx.EVT\_BUTTON,self.OnClicked) 
  self.bmpbtn1.SetLabel("OPEN") 

  bmp2 = wx.Bitmap("SAVE.BMP", wx.BITMAP\_TYPE\_BMP) 
  self.bmpbtn2 = wx.BitmapButton(panel, id = wx.ID\_ANY, bitmap = bmp2,
     size = (bmp.GetWidth()+10, bmp.GetHeight()+10))

  hbox.Add(self.bmpbtn2,0,wx.ALIGN\_CENTER) 
  self.bmpbtn2.Bind(wx.EVT\_BUTTON,self.OnClicked)
  self.bmpbtn2.SetLabel("SAVE") 

  vbox.Add(hbox,1,wx.ALIGN\_CENTER) 
  panel.SetSizer(vbox) 

  self.Centre() 
  self.Show() 
  self.Fit()  

def OnClicked(self, event):
btn = event.GetEventObject().GetLabel()
print "Label of pressed button = ",btn

def OnToggle(self,event):
state = event.GetEventObject().GetValue()

  if state == True: 
     print "Toggle button state off" 
     event.GetEventObject().SetLabel("click to off") 
  else: 
     print " Toggle button state on" 
     event.GetEventObject().SetLabel("click to on") 

app = wx.App()
Mywin(None, 'Button Demo - www.yiibai.com')
app.MainLoop()

上面的代碼產生下面的輸出 -
wxPython

Label of pressed button = click Me

Toggle button state off

Toggle button state on

Label of pressed button = NEW

Label of pressed button = OPEN

Label of pressed button = SAVE