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 binder 将一个处理函数与之关联。
另一方面,切换按钮使用 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()
上述代码产生以下输出−
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