Как сделать пользовательские кнопки в wx? - PullRequest
6 голосов
/ 29 августа 2009

Я хотел бы сделать пользовательскую кнопку в wxPython. С чего мне начать, как мне это сделать?

Ответы [ 4 ]

8 голосов
/ 01 сентября 2009

Вот скелет, который вы можете использовать, чтобы нарисовать полностью пользовательскую кнопку, в зависимости от вашего воображения, как она выглядит или ведет себя

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 
5 голосов
/ 29 августа 2009

Когда я хотел узнать, как создавать собственные виджеты (включая кнопки), я ссылался на страницу Андреа Гаваны (полный рабочий пример там) на табличке wxPyWiki и Cody Precord (источник находится в wx.lib. platebtn, также здесь в svn). Посмотрите на оба из них, и вы сможете создать практически любой пользовательский виджет, который вам нужен.

3 голосов
/ 29 августа 2009

Вы можете расширить класс кнопок по умолчанию, например, так:

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

Каждый раз, когда вы добавляете RedButton в свой макет, он должен отображаться красным (хотя еще не проверял).

2 голосов
/ 29 августа 2009

Попробуйте использовать универсальную кнопку или растровую кнопку .

...