在任何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()
上面的代码产生下面的输出 -
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