import wx import colorsys from math import cos, sin, radians #---------------------------------------------------------------------- BASE = 80.0 # sizes used in shapes drawn below BASE2 = BASE/2 BASE4 = BASE/4 class TestPanel(wx.Panel): def __init__(self, parent): wx.Panel.__init__(self, parent, -1) self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, evt): dc = wx.PaintDC(self) try: gc = wx.GraphicsContext.Create(dc) except NotImplementedError: dc.DrawText("This build of wxPython does not support the wx.GraphicsContext " "family of classes.", 25, 25) return font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT) font.SetWeight(wx.BOLD) gc.SetFont(font, wx.BLACK) # wird ignoriert # make a path that contains a circle and some lines, centered at 0,0 path = gc.CreatePath() path.AddCircle(0, 0, BASE2) path.MoveToPoint(0, -BASE2) path.AddLineToPoint(0, BASE2) path.MoveToPoint(-BASE2, 0) path.AddLineToPoint(BASE2, 0) path.CloseSubpath() path.AddRectangle(-BASE4, -BASE4/2, BASE2, BASE4) # Now use that path to demonstrate various capbilites of the grpahics context gc.PushState() # save current translation/scale/other state gc.Translate(60, 75) # reposition the context origin gc.SetPen(wx.Pen("navy", 1)) gc.SetBrush(wx.Brush("pink")) # show the difference between stroking, filling and drawing for label, PathFunc in [("StrokePath", gc.StrokePath), ("FillPath", gc.FillPath), ("DrawPath", gc.DrawPath)]: w, h = gc.GetTextExtent(label) gc.DrawText(label, -w/2, -BASE2-h-4) PathFunc(path) gc.Translate(2*BASE, 0) gc.PopState() # restore saved state gc.PushState() # save it again gc.Translate(60, 200) # offset to the lower part of the window gc.DrawText("Scale", 0, -BASE2) gc.Translate(0, 20) # for testing clipping #gc.Clip(0, 0, 100, 100) #rgn = wx.RegionFromPoints([ (0,0), (75,0), (75,25,), (100, 25), # (100,100), (0,100), (0,0) ]) #gc.ClipRegion(rgn) #gc.ResetClip() gc.SetBrush(wx.Brush(wx.Colour(178, 34, 34, 128))) # 128 == half transparent for cnt in range(8): gc.Scale(1.08, 1.08) # increase scale by 8% gc.Translate(5,5) gc.DrawPath(path) gc.PopState() # restore saved state gc.PushState() # save it again gc.Translate(400, 200) gc.DrawText("Rotate", 0, -BASE2) # Move the origin over to the next location gc.Translate(0, 75) # draw our path again, rotating it about the central point, # and changing colors as we go for angle in range(0, 360, 30): gc.PushState() # save this new current state so we can # pop back to it at the end of the loop r, g, b = [int(c * 255) for c in colorsys.hsv_to_rgb(float(angle)/360, 1, 1)] gc.SetBrush(wx.Brush(wx.Colour(r, g, b, 64))) gc.SetPen(wx.Pen(wx.Colour(r, g, b, 128))) # use translate to artfully reposition each drawn path gc.Translate(1.5 * BASE2 * cos(radians(angle)), 1.5 * BASE2 * sin(radians(angle))) # use Rotate to rotate the path gc.Rotate(radians(angle)) # now draw it gc.DrawPath(path) gc.PopState() class MyFrame(wx.Frame): """ Grafik-Fenster. """ def __init__(self, parent, title): wx.Frame.__init__(self, parent, -1, title, pos=(50, 50), size=(600, 600)) # Create the menubar menuBar = wx.MenuBar() # and a menu menu = wx.Menu() menu2 =wx.Menu() # add an item to the menu, using \tKeyName automatically # creates an accelerator, the third param is some help text # that will show up in the statusbar menu.Append(wx.ID_EXIT, "B&eenden\tAlt-X", "Schliessen der Anwendung") # bind the menu event to an event handler self.Bind(wx.EVT_MENU, self.OnTimeToClose, id=wx.ID_EXIT) # and put the menu on the menubar menuBar.Append(menu, "&Datei") menuBar.Append(menu2, "&Hilfe") self.SetMenuBar(menuBar) self.CreateStatusBar() # Now create the Panel to put the other controls on. panel = TestPanel(self) def OnTimeToClose(self, evt): """Event handler for the button click.""" print( "ENDE!" ) self.Close() class MyApp(wx.App): def OnInit(self): frame = MyFrame(None, "Grafik") self.SetTopWindow(frame) frame.Show(True) return True app = MyApp(redirect=False) app.MainLoop()