Хорошо абсолютно оставлять память неосвобожденной, когда Вы выходите; malloc () выделяет память от области памяти, названной ""куча"", и полная "куча" процесса освобождена, когда процесс выходит.
Однако одна причина, почему люди все еще настаивают, что хорошо освободить все, прежде чем выход состоит в том, что отладчики памяти (например, valgrind на Linux) обнаруживают неосвобожденные блоки как утечки памяти, и если у Вас есть также "реальные" утечки памяти, становится более трудным определить их, если Вы также получаете "поддельные" результаты в конце.
Вот скелет, который вы можете использовать для рисования полностью настраиваемой кнопки, его зависит от вашего воображения, как он выглядит или ведет себя
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 e.g. dc.DrawBitmap
if self._mouseIn:
pass# on mouserover may be draw different bitmap
if self._mouseDown:
pass # draw different image text
Когда я хотел узнать, как создавать собственные виджеты (включая кнопки), я сослался на страницу Андреа Гаваны (полный рабочий пример там) на wxPyWiki и кнопку Коди Прекорда ( исходный код находится в wx.lib.platebtn, также здесь в svn). Посмотрите на оба варианта, и вы сможете создать практически любой пользовательский виджет, который вам нужен.
Класс кнопки по умолчанию можно расширить, например, так:
class RedButton(wx.Button):
def __init__(self, *a, **k):
wx.Button.__init__(self, *a, **k)
self.SetBackgroundColour('RED')
# more customization here
Каждый раз, когда вы вставляете RedButton
в свой макет, она должна отображаться красным (не хотя тестировал).
Попробуйте использовать обычную кнопку или кнопку Bitmap .