]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/GraphicsContext.py
   4 from math 
import cos
, sin
, radians
 
   6 #---------------------------------------------------------------------- 
   8 BASE  
= 80.0    # sizes used in shapes drawn below 
  13 class TestPanel(wx
.Panel
): 
  14     def __init__(self
, parent
, log
): 
  16         wx
.Panel
.__init
__(self
, parent
, -1) 
  18         self
.Bind(wx
.EVT_PAINT
, self
.OnPaint
) 
  20     def OnPaint(self
, evt
): 
  23             gc 
= wx
.GraphicsContext
.Create(dc
) 
  24         except NotImplementedError: 
  25             dc
.DrawText("This build of wxPython does not support the wx.GraphicsContext " 
  30         font 
= wx
.SystemSettings
.GetFont(wx
.SYS_DEFAULT_GUI_FONT
) 
  31         font
.SetWeight(wx
.BOLD
) 
  34         # make a path that contains a circle and some lines, centered at 0,0 
  35         path 
= gc
.CreatePath() 
  36         path
.AddCircle(0, 0, BASE2
) 
  37         path
.MoveToPoint(0, -BASE2
) 
  38         path
.AddLineToPoint(0, BASE2
) 
  39         path
.MoveToPoint(-BASE2
, 0) 
  40         path
.AddLineToPoint(BASE2
, 0) 
  42         path
.AddRectangle(-BASE4
, -BASE4
/2, BASE2
, BASE4
) 
  45         # Now use that path to demonstrate various capbilites of the grpahics context 
  46         gc
.PushState()             # save current translation/scale/other state  
  47         gc
.Translate(60, 75)       # reposition the context origin 
  49         gc
.SetPen(wx
.Pen("navy", 1)) 
  50         gc
.SetBrush(wx
.Brush("pink")) 
  52         # show the difference between stroking, filling and drawing 
  53         for label
, PathFunc 
in [("StrokePath", gc
.StrokePath
), 
  54                                 ("FillPath",   gc
.FillPath
), 
  55                                 ("DrawPath",   gc
.DrawPath
)]: 
  56             if "wxGTK" in wx
.PlatformInfo
: 
  57                 w
, h 
= dc
.GetTextExtent(label
) # NYI in Cairo context 
  59                 w
, h 
= gc
.GetTextExtent(label
) 
  61             gc
.DrawText(label
, -w
/2, -BASE2
-h
) 
  63             gc
.Translate(2*BASE
, 0) 
  66         gc
.PopState()              # restore saved state 
  67         gc
.PushState()             # save it again 
  68         gc
.Translate(60, 200)      # offset to the lower part of the window 
  70         gc
.DrawText("Scale", 0, -BASE2
) 
  73         # for testing clipping 
  74         #gc.Clip(0, 0, 100, 100) 
  75         #rgn = wx.RegionFromPoints([ (0,0), (75,0), (75,25,), (100, 25), 
  76         #                            (100,100), (0,100), (0,0)  ]) 
  80         gc
.SetBrush(wx
.Brush(wx
.Colour(178,  34,  34, 128)))   # 128 == half transparent 
  82             gc
.Scale(1.08, 1.08)    # increase scale by 8% 
  87         gc
.PopState()              # restore saved state 
  88         gc
.PushState()             # save it again 
  89         gc
.Translate(400, 200) 
  90         gc
.DrawText("Rotate", 0, -BASE2
) 
  93         for angle 
in range(0, 360, 30): 
  94             gc
.PushState()         # save this new current state so we can pop back to  
  95                                    # it at the end of the loop 
  96             r
, g
, b 
= [int(c 
* 255) for c 
in colorsys
.hsv_to_rgb(float(angle
)/360, 1, 1)] 
  97             gc
.SetBrush(wx
.Brush(wx
.Colour(r
, g
, b
, 64))) 
  99             # use translate to artfully reposition each drawn path 
 100             gc
.Translate(1.5 * BASE2 
* cos(radians(angle
)), 
 101                          1.5 * BASE2 
* sin(radians(angle
))) 
 103             # use Rotate to rotate the path 
 104             gc
.Rotate(radians(angle
)) 
 113 #---------------------------------------------------------------------- 
 115 def runTest(frame
, nb
, log
): 
 116     win 
= TestPanel(nb
, log
) 
 119 #---------------------------------------------------------------------- 
 123 overview 
= """<html><body> 
 124 <h2><center>wx.GraphicsContext and wx.GraphicsPath</center></h2> 
 126 The new advanced 2D drawing API is implemented via the 
 127 wx.GraphicsContext and wx.GraphicsPath classes.  They wrap GDI+ on 
 128 Windows, Cairo on wxGTK and CoreGraphics on OS X.  They allow 
 129 path-based drawing with alpha-blending and anti-aliasing, and use a 
 130 floating point cooridnate system. 
 132 <p>When viewing this sample pay attention to how the rounded edges are 
 133 smoothed with anti-aliased drawing, and how the shapes on the lower 
 134 half of the window are partially transparent, allowing you to see what 
 142 if __name__ 
== '__main__': 
 145     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])