Wxpython 简明教程

wxPython - Buttons

按钮组件在任何 GUI 界面中都使用最广泛。它捕获用户生成的单击事件。它最明显的使用是触发绑定到它的一个处理程序函数。

wxPython 类库提供了不同类型的按钮。有一个简单的传统按钮, wx.Button 类对象,它的标题带有一些文本。也有一个二状态按钮,名为 wx.ToggleButton 。它的按下或松开状态可以通过事件处理程序函数来识别。

另一种类型的按钮 wx.BitmapButton ,它的表面显示一个位图(图像)作为图标。

wx.Button 类和 wx.ToggleButton 类的构造函数接收以下参数 −

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

以下是 wx.Button 类的一些重要方法 −

S.N.

Methods & Description

1

SetLabel() 以编程方式设置按钮的标题

2

GetLabel() Returns the button’s caption

3

SetDefault() 为顶级窗口设置默认按钮。在按下 Enter 键时模拟单击事件

wx.ToggleButton 类的两个重要方法是:

S.N.

Methods & Description

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)

Note ——由于 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()

上述代码生成以下输出 -

buttons output

按下按钮的标签 = 单击我

切换按钮状态关闭

切换按钮状态开启

按下按钮的标签 = 新建

按下按钮的标签 = 打开

按下按钮的标签 = 保存