- 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