
- wxPython 教程
- wxPython - 首頁
- wxPython - 簡介
- wxPython - 環境搭建
- wxPython - Hello World
- wxPython - GUI 構建工具
- wxPython - 主要類
- wxPython - 事件處理
- wxPython - 佈局管理
- wxPython - 按鈕
- wxPython - 可停靠視窗
- 多文件介面
- wxPython - 繪圖 API
- wxPython - 拖放操作
- wxPython 資源
- wxPython - 快速指南
- wxPython - 有用資源
- wxPython - 討論
wxPython - 按鈕
按鈕部件在任何 GUI 介面中都得到最廣泛的應用。它捕獲使用者生成的點選事件。其最明顯的用途是觸發與其繫結的處理程式函式。
wxPython 類庫提供了不同型別的按鈕。有一個簡單的傳統按鈕,wx.Button 類物件,它帶有某些文字作為其標題。還提供了一個雙狀態按鈕,名為wx.ToggleButton。其按下或彈起狀態可以透過事件處理程式函式識別。
另一種型別的按鈕,wx.BitmapButton 在其表面顯示點陣圖(影像)作為圖示。
wx.Button 類和 wx.ToggleButton 類的建構函式採用以下引數:
Wx.Button(parent, id, label, pos, size, style)
以下是 wx.Button 類的一些重要方法:
序號 | 方法及描述 |
---|---|
1 | SetLabel() 以程式設計方式設定按鈕的標題 |
2 | GetLabel() 返回按鈕的標題 |
3 | SetDefault() 將按鈕設定為頂級視窗的預設按鈕。模擬按下 Enter 鍵時的點選事件 |
wx.ToggleButton 類有兩個重要的方法:
序號 | 方法及描述 |
---|---|
1 | GetValue() 返回切換按鈕的狀態(開/關) |
2 | SetValue() 以程式設計方式設定按鈕的狀態 |
為了建立點陣圖按鈕,首先需要根據影像檔案構建點陣圖物件。
最常用的是 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 |
此點陣圖物件用作 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)
三個點陣圖按鈕被新增到水平盒子尺寸器中。這些按鈕顯示影像作為圖示作為其標題。
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)
這些按鈕的內部標籤分別設定為 NEW、OPEN 和 SAVE。
OnClicked() 事件處理程式函式檢索導致點選事件的源按鈕的標籤。該標籤列印到控制檯。
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') app.MainLoop()
以上程式碼產生以下輸出:

按下按鈕的標籤 = click Me
切換按鈕狀態關閉
切換按鈕狀態開啟
按下按鈕的標籤 = NEW
按下按鈕的標籤 = OPEN
按下按鈕的標籤 = SAVE