wxPython - Botões

O widget de botão é mais amplamente usado em qualquer interface GUI. Ele captura o evento de clique gerado pelo usuário. Seu uso mais óbvio é acionar uma função de tratamento associada a ele.

A biblioteca de classes wxPython fornece diferentes tipos de botões. Existe um botão simples e tradicional,wx.Buttonobjeto de classe, que carrega algum texto como legenda. Um botão de dois estados também está disponível, denominadowx.ToggleButton. Seu estado pressionado ou deprimido pode ser identificado pela função eventhandler.

Outro tipo de botão, wx.BitmapButton exibe um bitmap (imagem) como ícone em sua face.

O construtor para as classes wx.Button e wx.ToggleButton leva os seguintes argumentos -

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

Estes são alguns métodos importantes da classe wx.Button -

SN Métodos e Descrição
1

SetLabel()

Define a legenda do botão de maneira programática

2

GetLabel()

Retorna a legenda do botão

3

SetDefault()

O botão é definido como padrão para a janela de nível superior. Emula o evento de clique ao pressionar a tecla Enter

Dois métodos importantes da classe wx.ToggleButton são -

SN Métodos e Descrição
1

GetValue()

Retorna o estado do botão de alternância (liga / desliga)

2

SetValue()

Define o estado do botão de forma programática

Para criar um botão de bitmap, em primeiro lugar, um objeto de bitmap precisa ser construído a partir de um arquivo de imagem.

A seguinte variação do construtor da classe wx.Bitmap é mais comumente usada -

Wx.Bitmap(fiiename, wx.BITMAP_TYPE)

Algumas das constantes de tipo de bitmap predefinidas são -

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 bitmap é usado como um dos parâmetros para o construtor da classe wx.BitmapButton.

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

Em algumas plataformas de sistema operacional, o botão de bitmap pode exibir bitmap e rótulo. Os métodos SetLabel () atribuem a legenda. Em outras plataformas, ele serve como um rótulo interno.

O botão normal e também o botão de bitmap emite um wx.CommandEvent. EVT_BUTTON binder associa uma função de manipulador a ele.

O botão de alternância, por outro lado, usa o fichário wx.TOGGLEBUTTON para manipulação de eventos.

No exemplo a seguir, os botões de todos os três tipos são colocados em um dimensionador de caixa vertical de um painel.

O objeto de botão simples é criado usando a instrução -

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

O botão de alternância é construído pela seguinte declaração -

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

Esses botões são adicionados ao dimensionador vertical usando as seguintes instruções -

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

Note - Por causa do sinalizador wx.EXPAND, o botão de alternância ocupa toda a largura do quadro.

Usando os fichários EVT_BUTTON e EVT_TOGGLEBUTTON, eles são associados aos respectivos manipuladores.

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

Três botões de bitmap são adicionados a um dimensionador de caixa horizontal. Esses botões exibem uma imagem como ícone e legenda.

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

O evento de clique desses três botões é direcionado ao 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)

Os rótulos internos desses botões são definidos como NOVO, ABRIR e SALVAR, respectivamente.

A função de manipulador de eventos OnClicked () recupera o rótulo do botão de origem, que causou o evento click. Essa etiqueta está impressa no console.

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

O manipulador de eventos OnToggle () é disparado quando o botão de alternância é clicado. Seu estado é lido pelo método GetValue () e, conseqüentemente, a legenda do botão é definida.

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

A lista de códigos completa é a seguinte -

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

O código acima produz a seguinte saída -

Rótulo do botão pressionado = clique em mim

Desativar estado do botão

Ativar estado do botão

Rótulo do botão pressionado = NOVO

Rótulo do botão pressionado = ABRIR

Rótulo do botão pressionado = SALVAR