[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