[wxPython-users] Re: Trouble with drawing, I need some ideas :)

Peter Damoc pdamoc at gmail.com
Mon Oct 22 10:21:37 PDT 2007


Skipped content of type multipart/alternative-------------- next part -----=
---------
# We are the knights who say NI!
import wx
import colorsys

def DoNothing(*args, **kwargs):
    pass

def HSBtoRGB(hsb):
    """ hsb format: angle(hue).saturation.brightness"""
    h,s, b =3D map(int, hsb.split("."))
    return "#"+"".join([hex(int(x*255))[2:] for x in colorsys.hsv_to_rgb(h/=
360., s/100., b/100.)])
        =

class Widget(wx.Window):
    def __init__(self, parent, size=3D(20,20)):
        wx.Window.__init__(self, parent, size=3Dsize, style=3Dwx.TRANSPAREN=
T_WINDOW)
        self.Bind(wx.EVT_ERASE_BACKGROUND, DoNothing)
    def render(self, target):
        pass

class ButtonWidget(Widget):
    def __init__(self, parent, size=3D(20,20)):
        Widget.__init__(self, parent, size)
        =

        P_UP =3D "#252525"
        P_CENTER =3D "#161616"
        P_DOWN =3D "#000000"
        P_CONTOUR =3D "#343434"
        =

        self.button_pen =3D wx.Pen(P_CONTOUR, 1)        =

        self.p_up =3D wx.Brush(P_UP)
        self.p_down =3D wx.Brush(P_DOWN)        =

        self.p_center_pen =3D wx.Pen(P_CENTER, 1)
        =

    def render(self, target):
        x, y =3D self.GetPosition()
        w, h =3D self.GetSize()
        =

        target.SetPen(self.button_pen)
        target.SetBrush(self.p_down)
        target.DrawRoundedRectangle(x, y, w, h, 5)
        target.SetBrush(self.p_up)
        target.SetClippingRegion(x, y, w, h/2)
        target.DrawRoundedRectangle(x, y, w, h, 5)
        target.DestroyClippingRegion()
        target.SetPen(self.p_center_pen)
        target.DrawLine(x+1, y+h/2, x+w-2, y+h/2)

class TextWidget(Widget):
    def __init__(self, parent, text=3D""):
        Widget.__init__(self, parent)
        self.text =3D text
        w, h =3D parent.mdc.GetTextExtent(text)
        self.SetSize((w, h))
        =

    def SetFont(self, font):
        old_font =3D self.GetParent().mdc.GetFont()
        self.GetParent().mdc.SetFont(font)
        w, h =3D self.GetParent().mdc.GetTextExtent(self.text)
        self.GetParent().mdc.SetFont(old_font)
        self.SetSize((w, h))
        self.GetParent().Layout()
        Widget.SetFont(self, font)
        =

    def render(self, target):
        x, y =3D self.GetPosition()
        old_font =3D target.GetFont()
        target.SetFont(self.GetFont())
        target.DrawText(self.text, x, y)
        target.SetFont(old_font)
    =

class RenderingPanel(wx.Panel):
    def __init__(self, parent, size=3D(-1,-1)):
        wx.Panel.__init__(self, parent, size=3Dsize)
        self.mdc =3D wx.MemoryDC(wx.EmptyBitmap(1,1))
        =

        # event binding
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        self.Bind(wx.EVT_ERASE_BACKGROUND, DoNothing)
    =

    def render(self, target):
        pass
        =

    def recreate_buffer(self):
        w, h =3D self.GetSize()
        self.mdc =3D wx.MemoryDC(wx.EmptyBitmap(w,h))
        gc =3D wx.GCDC(self.mdc)
        =

        self.render(gc)
        for c in self.GetChildren():
            if c.GetWindowStyleFlag() =3D=3D wx.TRANSPARENT_WINDOW:
                c.render(gc)
        self.Refresh()
        =

    def OnPaint(self, evt):
        w, h =3D self.GetSize()
        w2, h2 =3D self.mdc.GetSize()
        if w !=3D w2 or h!=3D h2:
            wx.CallAfter(self.recreate_buffer)
        else:
            pdc =3D wx.PaintDC(self)
            pdc.Blit(0,0,w,h, self.mdc,0,0)
        evt.Skip()
        =


class GrayGradientPanel(RenderingPanel):
    =

    def render(self, target):
        w, h =3D self.GetSize()
        target.GradientFillLinear((0,0,w,h), "#c3c4c2", "#949393", wx.SOUTH)
        =

        target.SetPen(wx.Pen("#e2e2e2", 1))
        target.DrawLine(0,1,w,1)
        =

        target.SetPen(wx.Pen("#404040", 1))
        target.DrawLine(0,h-1,w,h-1)
        =

        target.SetPen(wx.Pen("#6d6d6d", 1))
        target.DrawLine(0,0,w,0)
        target.DrawLine(0,0,0,h)
        target.DrawLine(w-1,0,w-1,h)
        target.SetTextForeground("white")

class LightGradientPanel(RenderingPanel):
    def __init__(self, parent, size=3D(-1,-1), angle=3D90, saturation=3D25,=
 inverted=3DFalse):
        RenderingPanel.__init__(self, parent, size=3Dsize)
        self.angle =3D angle
        self.inverted =3D inverted
        self.saturation =3D saturation
    def render(self, target):
        w, h =3D self.GetSize()
        start =3D HSBtoRGB("%d.%d.100"%(self.angle, self.saturation))
        end =3D HSBtoRGB("%d.%d.100"%(self.angle, min(100, self.saturation+=
50)))
        if self.inverted:
            start, end =3D end, start
        target.GradientFillLinear((0,0,w,h), start, end, wx.SOUTH)
        =

    =


if __name__ =3D=3D"__main__":
    from wx.lib.splitter import MultiSplitterWindow
    app =3D wx.App(0)
    frame =3D wx.Frame(None, size=3D(800,600))
    outerbox =3D wx.BoxSizer(wx.VERTICAL)
    =

    splitter =3D MultiSplitterWindow(frame, size=3D(-1, 200), style=3Dwx.SP=
_LIVE_UPDATE)
    =

    =

    left =3D LightGradientPanel(splitter, angle=3D90)
    right =3D LightGradientPanel(splitter, angle=3D0, inverted=3DTrue)
    splitter.AppendWindow(left, 200)
    splitter.AppendWindow(right)

    outerbox.Add(GrayGradientPanel(frame, size=3D(32,64)), 0, wx.EXPAND)
    outerbox.Add(splitter, 1, wx.EXPAND)
    outerbox.Add(GrayGradientPanel(frame, size=3D(32,32)), 0, wx.EXPAND)
    frame.SetSizer(outerbox)
    frame.CenterOnScreen()
    frame.Show()
    app.MainLoop()
   =20


More information about the wxpython-users mailing list