¿Cómo hacer botones personalizados en wx?

Me gustaría hacer un botón personalizado en wxPython. ¿Dónde debo empezar, cómo debo hacerlo?

Aquí hay un esqueleto que puede usar para dibujar un botón totalmente personalizado, depende de su imaginación cómo se ve o se comporta.

class MyButton(wx.PyControl): def __init__(self, parent, id, bmp, text, **kwargs): wx.PyControl.__init__(self,parent, id, **kwargs) self.Bind(wx.EVT_LEFT_DOWN, self._onMouseDown) self.Bind(wx.EVT_LEFT_UP, self._onMouseUp) self.Bind(wx.EVT_LEAVE_WINDOW, self._onMouseLeave) self.Bind(wx.EVT_ENTER_WINDOW, self._onMouseEnter) self.Bind(wx.EVT_ERASE_BACKGROUND,self._onEraseBackground) self.Bind(wx.EVT_PAINT,self._onPaint) self._mouseIn = self._mouseDown = False def _onMouseEnter(self, event): self._mouseIn = True def _onMouseLeave(self, event): self._mouseIn = False def _onMouseDown(self, event): self._mouseDown = True def _onMouseUp(self, event): self._mouseDown = False self.sendButtonEvent() def sendButtonEvent(self): event = wx.CommandEvent(wx.wxEVT_COMMAND_BUTTON_CLICKED, self.GetId()) event.SetInt(0) event.SetEventObject(self) self.GetEventHandler().ProcessEvent(event) def _onEraseBackground(self,event): # reduce flicker pass def _onPaint(self, event): dc = wx.BufferedPaintDC(self) dc.SetFont(self.GetFont()) dc.SetBackground(wx.Brush(self.GetBackgroundColour())) dc.Clear() # draw whatever you want to draw # draw glossy bitmaps eg dc.DrawBitmap if self._mouseIn: pass# on mouserover may be draw different bitmap if self._mouseDown: pass # draw different image text 

Cuando quise aprender a hacer widgets personalizados (botones incluidos) hice referencia a la página de Andrea Gavana (ejemplo de trabajo completo allí) en el botón de placa wxPyWiki y Cody Precord (la fuente está en wx.lib.platebtn, también aquí en svn). Mire ambos y debería poder crear la mayoría de los widgets personalizados que desee.

Puede ampliar la clase de botón predeterminada, como esta por ejemplo:

 class RedButton(wx.Button): def __init__(self, *a, **k): wx.Button.__init__(self, *a, **k) self.SetBackgroundColour('RED') # more customization here 

Cada vez que pones un RedButton en tu diseño, debería aparecer rojo (aunque no lo he probado).

Intente usar un botón genérico o un botón de bitmap .