wxPython - Botones

El widget de botón se usa más ampliamente en cualquier interfaz GUI. Captura el evento de clic generado por el usuario. Su uso más obvio es activar una función de controlador vinculada a él.

La biblioteca de clases wxPython proporciona diferentes tipos de botones. Hay un botón simple y tradicional,wx.Buttonobjeto de clase, que lleva un texto como título. También está disponible un botón de dos estados, que se denominawx.ToggleButton. Su estado presionado o deprimido se puede identificar mediante la función de manejador de eventos.

Otro tipo de botón, wx.BitmapButton muestra un mapa de bits (imagen) como icono en su cara.

El constructor para la clase wx.Button y la clase wx.ToggleButton toma los siguientes argumentos:

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

Estos son algunos métodos importantes de la clase wx.Button:

SN Métodos y descripción
1

SetLabel()

Establece el título del botón mediante programación

2

GetLabel()

Devuelve el título del botón

3

SetDefault()

El botón está configurado por defecto para la ventana de nivel superior. Emula el evento de clic al presionar la tecla Enter

Dos métodos importantes de la clase wx.ToggleButton son:

SN Métodos y descripción
1

GetValue()

Devuelve el estado del botón de alternancia (encendido / apagado)

2

SetValue()

Establece el estado del botón mediante programación

Para crear un botón de mapa de bits, en primer lugar, es necesario construir un objeto de mapa de bits a partir de un archivo de imagen.

La siguiente variación del constructor de clase wx.Bitmap es la más utilizada:

Wx.Bitmap(fiiename, wx.BITMAP_TYPE)

Algunas de las constantes de tipo de mapa de bits predefinidas son:

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

Este objeto de mapa de bits se utiliza como uno de los parámetros del constructor de la clase wx.BitmapButton.

Wx.BitmapButton(parent, id, bitmap, pos, size, style)

En algunas plataformas de SO, el botón de mapa de bits puede mostrar tanto el mapa de bits como la etiqueta. Los métodos SetLabel () asignan el título. En otras plataformas, sirve como etiqueta interna.

El botón normal y el botón de mapa de bits emite un wx.CommandEvent. El enlazador EVT_BUTTON le asocia una función de controlador.

El botón de alternancia, por otro lado, utiliza la carpeta wx.TOGGLEBUTTON para el manejo de eventos.

En el siguiente ejemplo, los botones de los tres tipos se colocan en un medidor de cuadro vertical de un panel.

El objeto de botón simple se crea usando la declaración -

self.btn = wx.Button(panel, -1, "click Me")

El botón de alternancia se construye con la siguiente declaración:

self.tbtn = wx.ToggleButton(panel , -1, "click to on")

Estos botones se agregan al medidor vertical usando las siguientes declaraciones:

vbox.Add(self.btn,0,wx.ALIGN_CENTER) 
vbox.Add(self.tbtn,0,wx.EXPAND|wx.ALIGN_CENTER)

Note - Debido a la bandera wx.EXPAND, el botón de alternancia ocupa todo el ancho del marco.

Utilizando los aglutinantes EVT_BUTTON y EVT_TOGGLEBUTTON, se asocian con los respectivos manipuladores.

self.btn.Bind(wx.EVT_BUTTON,self.OnClicked) 
self.tbtn.Bind(wx.EVT_TOGGLEBUTTON,self.OnToggle)

Se agregan tres botones de mapa de bits en un medidor de cuadro horizontal. Estos botones muestran una imagen como icono como título.

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))

El evento de clic de estos tres botones se dirige al método 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)

Las etiquetas internas de estos botones se establecen en NUEVO, ABRIR y GUARDAR, respectivamente.

La función del controlador de eventos OnClicked () recupera la etiqueta del botón de origen, que provocó el evento de clic. Esa etiqueta está impresa en la consola.

def OnClicked(self, event): 
   btn = event.GetEventObject().GetLabel() 
   print "Label of pressed button = ",btn

El controlador de eventos OnToggle () se activa cuando se hace clic en el botón de alternancia. Su estado se lee mediante el método GetValue () y, en consecuencia, se establece el título del botón.

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")

La lista completa de códigos es la siguiente:

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()

El código anterior produce la siguiente salida:

Etiqueta del botón presionado = haz clic en mí

Desactivar el estado del botón

Activar el estado del botón

Etiqueta del botón pulsado = NUEVO

Etiqueta del botón pulsado = ABRIR

Etiqueta del botón pulsado = GUARDAR