Seite 1 von 1

Background eines widgets anpassen

Verfasst: Mittwoch 24. Mai 2006, 09:57
von george
Hey,

ich möchte gerne den Background eines widgets(z.B. wx.Toolbar) an meine Bedürfnisse anpassen. Damit meine ich, der Background soll nicht mehr nur mit einer Farbe dargestellt werden, sondern mit einem Gradienten(2 Farben)
Ich habe beispielhaft mir mal eine Klasse geschrieben, die von wx.Toolbar abgeleitet ist und dort im Event OnPaint den Background gezeichnet.

Code: Alles auswählen

class customToolbar(wx.ToolBar):
    
    def __init__(self, parent, id=-1, pos=wx.DefaultPosition, 
                 size=wx.DefaultSize, style=wx.TB_HORIZONTAL | wx.NO_BORDER, name=''):
        wx.ToolBar.__init__(self, parent, id=id, pos=wx.DefaultPosition, size=wx.DefaultSize,
                            style=style, name='')
        
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        
        self.__Colour = mdlGlobDefs.ColourManager.LUNA
        
    def OnPaint(self, event):
        self.__SetColours()
        dc = wx.PaintDC(self)
        rect = self.GetRect()
        self.__DrawGradient(dc, rect)
        event.Skip()
    
    
    
    def __SetColours(self):
        if (self.__Colour == mdlGlobDefs.ColourManager.LUNA):
            self.__colGradient1 = mdlGlobDefs.ColourManager.colLunaBlue1
            self.__colGradient2 = mdlGlobDefs.ColourManager.colLunaBlue2
            self.__colBorder    = mdlGlobDefs.ColourManager.colLunaBlue1
        elif (self.__Colour == mdlGlobDefs.ColourManager.OLIVE):
            self.__colGradient1 = mdlGlobDefs.ColourManager.colLunaOlive1
            self.__colGradient2 = mdlGlobDefs.ColourManager.colLunaOlive2
            self.__colBorder    = mdlGlobDefs.ColourManager.colLunaOlive1
        elif (self.__Colour == mdlGlobDefs.ColourManager.SILVER):
            self.__colGradient1 = mdlGlobDefs.ColourManager.colLunaSilver1
            self.__colGradient2 = mdlGlobDefs.ColourManager.colLunaSilver2
            self.__colBorder    = mdlGlobDefs.ColourManager.colLunaSilver1
        
    def __DrawGradient(self, dc, rect):
        if  rect.height < 1 or rect.width < 1:
            return

        col1 = self.__colGradient2
        col2 = self.__colGradient1

        dc.SetPen(wx.TRANSPARENT_PEN)

        r1, g1, b1 = int(col1.Red()), int(col1.Green()), int(col1.Blue())
        r2, g2, b2 = int(col2.Red()), int(col2.Green()), int(col2.Blue())

        flrect = float(rect.height)

        rstep = float((r2 - r1)) / flrect
        gstep = float((g2 - g1)) / flrect
        bstep = float((b2 - b1)) / flrect

        rf, gf, bf = 0, 0, 0

        for y in range(rect.y, rect.y + rect.height):
            currCol = (r1 + rf, g1 + gf, b1 + bf)
                
            dc.SetBrush(wx.Brush(currCol, wx.SOLID))
            dc.DrawRectangle(rect.x, rect.y + (y - rect.y), rect.width, rect.height)
            rf = rf + rstep
            gf = gf + gstep
            bf = bf + bstep
Das funktioniert soweit auch. Problem ist nur, dass wenn ich der Toolbar Toolbar-Buttons hinzufüge, bleiben diese immer im Hintergrund. Also hinter dem gezeichneten Gradienten. Sie sind nicht sichtbar.

Meine Frage ist jetzt, wie kann ich am einfachsten den Background des widgets manipulieren???
Hoffe, ihr könnt mir helfen und ein paar Tipps geben.
Danke

george