#!/usr/bin/env python #-Imports---------------------------------------------------------------------- #--Python Imports. import os import sys #--wxPython Imports. import wx from wx.lib.embeddedimage import PyEmbeddedImage #-Globals---------------------------------------------------------------------- paperairplane_arrow_blue24 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAACpUlEQVR42q3VC0hTYRgG4M6m" "m8uRmGaVV8SQSrDMbJ6azpZ40qXLXM05y2GikFdKS4PUrEINUygVQ0FalmU3soiIhEohbEGS" "RlQkRChUUAVBCL19/zBBNNDT+eBh8AO87LtsC6h+ExNRE45IWwo3d9DHBNETleQhfqEahMVa" "WMhPEkaUkgYErtHCWNSOkAgBnEz+mZ4CiKtkAaFRBmxNPwJDbj2Cw7eA42Tv6NmHuEgSEKY1" "wZjXgJiUYtiqLmNZcDjouZ94SxISrtsNS2kHNPG5EDKqkXe8G55LA1nIJeJJ5ER8rYszI6vC" "Dk1CgVNqXhMKTnVjoYc3C6kjHkQmOiBSn46cym5oth2ckl1uR9FJO5QqNbuRbKIWHbIxPgP5" "J65DY6iYpvT0Lew/2gq5q/L/boQXrDhQ34vo5GPT8Ck1qOvoQ1ZhDWRyF/E3EpOYiYqm+4je" "UTuDztwA+53nSDJls/UVdyO67XtQ3dKH6J2NsxJsbbj75BUieT0b+vxvJN64F7XtA+BNrf+U" "X30bjx2v4eamYiH3iNec11dItaHRPgje3DErU3EPHMMfoNE6v8E3kkaC5jwPQ5oNzVdegLdc" "nGGztQuOkTHssu7DAo5jgzaS9fNqU1KqFed7hsBbr86QU/UQff0OtkXsHkpIFFlOFHNeWSEx" "BeNfvuPZ8Bh6H42irWcElrIH2JR5Ew2dQzhUWft3uLFTrZlnwcvbBzp9AvJLDqOz6xrejI6j" "7MwgLvS+hZBsZgEtJIJ4ijm2QnKDvCSfqNe/fANCMPDUgfcffyAoZBULsJKVzmsWUWriT1aT" "tWQDKXdVKCfOnmuGr58/67+WrBD7yyojCuJOFk22YQmJI1/JBOHZm5T/1zKimhzq4GT/FxNJ" "iyMK4kP8nK0UUX8Azg5aSnmghYAAAAAASUVORK5CYII=") paperairplane_arrow_white24 = PyEmbeddedImage( "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAB2ElEQVR4Aa3VsatSYRiA8Twd" "y5Pa5SoXi0RpErQuQehQIEREi+ka5KSLew4uDaKLgy26C7bkpIHgaOlgSINIEjgo0f0HqiFo" "eXve4UxO174PfogqPpzj971eYf3EQ/jggdnl8/mEh+84xzXjgUQiIdlsViNfEYfXeKDZbEoy" "mdTIR0RgGw30+31pt9sSjUY18h4hXDUWGAwGsl6vpV6vSzgc1shbnMAyFtjv97JYLKRarYrf" "79fIawRhGQuo6XQqlUpFvF7vX95+BT88xgJqPB5LsVgUy7J+85En7hkxFlD6Wj6f11v1wz0j" "RgO73U56vd7hGTEVUNvtVrrdrqRSqcMzYiKgNpuNtFqtwzNiKqBms5luX91ZGqnjJiwjgdVq" "JY1Gw72CL3iKW7D/O6A/dKfTcefUNzzHPZwauYLlcimlUkm//A+KeIAz2JeeprpbdOiNRiPR" "26KByWQimUxGAx/wCHeO2ariOI7E43FJp9NSKBSkVqvJfD6X4XAosVjMnUtJBI450c/wBu/w" "CXsNlstl0fsfCAQ08AKxY/+MHERwFwncx0vm0EUul5NgMPiL548ROXayemDjOm4giBDO8RkX" "yCAEY8sDDd5GF0mcwPiycYozOLj0+gej7JQuh90YaAAAAABJRU5ErkJggg==") gFileDir = os.path.dirname(os.path.abspath(__file__)) ID_PAPERAIRPLANE_ARROW_BLUE = 2001 ID_PAPERAIRPLANE_ARROW_RED = 2002 ID_PAPERAIRPLANE_ARROW_GREY = 2003 ID_PAPERAIRPLANE_ARROW_DARK = 2004 ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80 = 2005 ID_PAPERAIRPLANE_ARROW_COLORSHIFT = 2006 ID_PAPERAIRPLANE_ARROW_WHITE = 2006 ID_PAPERAIRPLANE_ARROW_WHITE_PNG = 2007 ID_PAPERAIRPLANE_ARROW_BLUE_PY = 2008 ID_PAPERAIRPLANE_ARROW_WHITE_PY = 2009 cursors = { # .cur, .ani loose files. "paperairplane_arrow_blue.cur" : ID_PAPERAIRPLANE_ARROW_BLUE, "paperairplane_arrow_red.cur" : ID_PAPERAIRPLANE_ARROW_RED, "paperairplane_arrow_grey.cur" : ID_PAPERAIRPLANE_ARROW_GREY, "paperairplane_arrow_dark.cur" : ID_PAPERAIRPLANE_ARROW_DARK, "paperairplane_arrow_blue_fadeout80.cur" : ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80, "paperairplane_arrow_white.cur" : ID_PAPERAIRPLANE_ARROW_WHITE, "paperairplane_arrow_colorshift.ani" : ID_PAPERAIRPLANE_ARROW_COLORSHIFT, # .png loose files. "paperairplane_arrow_white24.png" : ID_PAPERAIRPLANE_ARROW_WHITE_PNG, # PyEmbeddedImages "paperairplane_arrow_blue24 [PyEmbeddedImage]" : ID_PAPERAIRPLANE_ARROW_BLUE_PY, "paperairplane_arrow_white24 [PyEmbeddedImage]" : ID_PAPERAIRPLANE_ARROW_WHITE_PY, # wxPython Stock Cursors. "wx.CURSOR_ARROW" : wx.CURSOR_ARROW, "wx.CURSOR_RIGHT_ARROW" : wx.CURSOR_RIGHT_ARROW, "wx.CURSOR_BULLSEYE" : wx.CURSOR_BULLSEYE, "wx.CURSOR_CHAR" : wx.CURSOR_CHAR, "wx.CURSOR_CROSS" : wx.CURSOR_CROSS, "wx.CURSOR_HAND" : wx.CURSOR_HAND, "wx.CURSOR_IBEAM" : wx.CURSOR_IBEAM, "wx.CURSOR_LEFT_BUTTON" : wx.CURSOR_LEFT_BUTTON, "wx.CURSOR_MAGNIFIER" : wx.CURSOR_MAGNIFIER, "wx.CURSOR_MIDDLE_BUTTON" : wx.CURSOR_MIDDLE_BUTTON, "wx.CURSOR_NO_ENTRY" : wx.CURSOR_NO_ENTRY, "wx.CURSOR_PAINT_BRUSH" : wx.CURSOR_PAINT_BRUSH, "wx.CURSOR_PENCIL" : wx.CURSOR_PENCIL, "wx.CURSOR_POINT_LEFT" : wx.CURSOR_POINT_LEFT, "wx.CURSOR_POINT_RIGHT" : wx.CURSOR_POINT_RIGHT, "wx.CURSOR_QUESTION_ARROW" : wx.CURSOR_QUESTION_ARROW, "wx.CURSOR_RIGHT_BUTTON" : wx.CURSOR_RIGHT_BUTTON, "wx.CURSOR_SIZENESW" : wx.CURSOR_SIZENESW, "wx.CURSOR_SIZENS" : wx.CURSOR_SIZENS, "wx.CURSOR_SIZENWSE" : wx.CURSOR_SIZENWSE, "wx.CURSOR_SIZEWE" : wx.CURSOR_SIZEWE, "wx.CURSOR_SIZING" : wx.CURSOR_SIZING, "wx.CURSOR_SPRAYCAN" : wx.CURSOR_SPRAYCAN, "wx.CURSOR_WAIT" : wx.CURSOR_WAIT, "wx.CURSOR_WATCH" : wx.CURSOR_WATCH, "wx.CURSOR_BLANK" : wx.CURSOR_BLANK, "wx.CURSOR_DEFAULT" : wx.CURSOR_DEFAULT, "wx.CURSOR_COPY_ARROW" : wx.CURSOR_COPY_ARROW, "wx.CURSOR_ARROWWAIT" : wx.CURSOR_ARROWWAIT, } #-Classes---------------------------------------------------------------------- class DrawWindow(wx.Window): def __init__(self, parent, log, id=wx.ID_ANY, pos=wx.DefaultPosition, size=wx.DefaultSize, style=0): wx.Window.__init__(self, parent, id, pos, size, style) self.log = log self.SetBackgroundColour(wx.WHITE) self.lines = [] self.x = self.y = 0 self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown) self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp) self.Bind(wx.EVT_MOTION, self.OnMotion) self.Bind(wx.EVT_PAINT, self.OnPaint) def OnPaint(self, event): dc = wx.PaintDC(self) self.DrawSavedLines(dc) def DrawSavedLines(self, dc): dc.SetPen(wx.Pen(wx.BLUE, 1)) for line in self.lines: for coords in line: dc.DrawLine(*coords) def OnLeftDown(self, event): self.curLine = [] self.x, self.y = event.GetPosition() self.CaptureMouse() def OnLeftUp(self, event): if self.HasCapture(): self.lines.append(self.curLine) self.curLine = [] self.ReleaseMouse() def OnMotion(self, event): if self.HasCapture() and event.Dragging(): dc = wx.ClientDC(self) dc.SetPen(wx.Pen(wx.BLUE, 1)) evtPos = event.GetPosition() coords = (self.x, self.y) + (evtPos.x, evtPos.y) self.curLine.append(coords) dc.DrawLine(*coords) self.x, self.y = event.GetPosition() class CursorTestPanel(wx.Panel): """ Cursor Test Panel inspired by AniFX cursor test panel. """ def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1, style=wx.BORDER_SUNKEN) # Create all the widgets for the test panel. pnl = wx.Panel(self, -1, style=wx.BORDER_SIMPLE) pnl.SetBackgroundColour(wx.BLACK) self.win = wx.Window(pnl, -1, size=(200, 100)) self.win.SetBackgroundColour("white") self.win.Bind(wx.EVT_LEFT_DOWN, self.OnDrawDot) self.drawWin = DrawWindow(pnl, log, size=(200, 100)) vbSizer0 = wx.BoxSizer(wx.VERTICAL) vbSizer0.Add(self.win, 1, wx.EXPAND | wx.BOTTOM, 1) vbSizer0.Add(self.drawWin, 1, wx.EXPAND) pnl.SetSizer(vbSizer0) b = wx.Button(self, -1, 'Button') tc = wx.TextCtrl(self, -1, 'Text Ctrl') rb1 = wx.RadioButton(self, -1, 'Radio Button 1') rb2 = wx.RadioButton(self, -1, 'Radio Button 2') cb = wx.CheckBox(self, -1, 'Check Box') combo = wx.ComboBox(self, -1, 'One', choices=('One', 'Two', 'Three', 'Four', 'Five')) sl = wx.Slider(self, -1) sc = wx.SpinCtrl(self, -1) # Add all the widgets to a tuple that we will access when changing cursors. self.allWidgets = (self, pnl, self.win, self.drawWin, b, tc, rb1, rb2, cb, combo, sl, sc) # Do the panel layout. vbSizer = wx.BoxSizer(wx.VERTICAL) hbSizer = wx.BoxSizer(wx.HORIZONTAL) gSizer = wx.GridSizer(rows=4, cols=2, vgap=5, hgap=5) gSizer.AddMany((b, tc, rb1, rb2, cb, combo, sl, sc)) hbSizer.Add(pnl, 0, wx.EXPAND | wx.ALL, 10) hbSizer.Add(gSizer, 0, wx.EXPAND | wx.ALL, 10) vbSizer.Add(hbSizer, 0, wx.ALL, 10) self.SetSizer(vbSizer) def OnDrawDot(self, event): # Draw a dot so the user can see where the hotspot is. dc = wx.ClientDC(self.win) dc.SetPen(wx.Pen("RED")) dc.SetBrush(wx.Brush("RED")) pos = event.GetPosition() dc.DrawCircle(pos.x, pos.y, 4) class TestPanel(wx.Panel): def __init__(self, parent, log): self.log = log wx.Panel.__init__(self, parent, -1) # Create a list of choices from the dictionary above. choices = sorted(cursors) # Create the controls. self.cb = wx.ComboBox(self, -1, "wx.CURSOR_DEFAULT", choices=choices, style=wx.CB_READONLY) self.tx = wx.StaticText(self, -1, """\ This sample allows you to see all the stock cursors available to wxPython, and also custom cursors loaded from images, .cur, or .ani files. Simply select a name from the wx.Choice and then move the mouse into the window or the widgets below to see the cursor. NOTE: not all stock cursors have a specific representation on all platforms. """) self.testPanel = CursorTestPanel(self, log) # Bind events. self.Bind(wx.EVT_COMBOBOX, self.OnChooseCursor, self.cb) # Setup the layout. vbSizer = wx.BoxSizer(wx.VERTICAL) vbSizer.Add(self.tx, 0, wx.ALL, 10) vbSizer.Add(self.cb, 0, wx.LEFT | wx.BOTTOM, 10) gbs = wx.GridBagSizer(8, 8) gbs.Add(self.testPanel, (0, 1), (1, 4), wx.ALIGN_LEFT) vbSizer.Add(gbs, 0, wx.ALL) self.SetSizer(vbSizer) wx.CallAfter(self.cb.SetFocus) # Convenience start for mousewheel switching. def OnChooseCursor(self, evt): # Clear the dots. self.testPanel.win.Refresh() self.testPanel.drawWin.lines = [] self.testPanel.drawWin.Refresh() choice = self.cb.GetStringSelection() self.log.WriteText("Selecting the %s cursor\n" % choice) cnum = cursors[choice] if cnum in (ID_PAPERAIRPLANE_ARROW_BLUE, ID_PAPERAIRPLANE_ARROW_RED, ID_PAPERAIRPLANE_ARROW_GREY, ID_PAPERAIRPLANE_ARROW_DARK, ID_PAPERAIRPLANE_ARROW_BLUE_FADEOUT80, ID_PAPERAIRPLANE_ARROW_WHITE, ID_PAPERAIRPLANE_ARROW_COLORSHIFT): # .cur or .ani loose files. if choice.endswith('.ani'): cursor = wx.Cursor(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_ANI) if choice.endswith('.cur'): cursor = wx.Cursor(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_CUR) elif cnum == ID_PAPERAIRPLANE_ARROW_WHITE_PNG: # .png loose files. image = wx.Image(gFileDir + os.sep + 'cursors' + os.sep + choice, wx.BITMAP_TYPE_PNG) # Since these image didn't come from a .cur or .ani file, # tell it where the hotspot is. image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 0) image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 0) # Make the image into a cursor. cursor = wx.Cursor(image) elif cnum in (ID_PAPERAIRPLANE_ARROW_BLUE_PY, ID_PAPERAIRPLANE_ARROW_WHITE_PY): # PyEmbeddedImages if cnum == ID_PAPERAIRPLANE_ARROW_BLUE_PY: image = paperairplane_arrow_blue24.GetImage() elif cnum == ID_PAPERAIRPLANE_ARROW_WHITE_PY: image = paperairplane_arrow_white24.GetImage() # Since these image didn't come from a .cur or .ani file, # tell it where the hotspot is. image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_X, 0) image.SetOption(wx.IMAGE_OPTION_CUR_HOTSPOT_Y, 0) # Make the image into a cursor. cursor = wx.Cursor(image) else: # Create one of the stock (built-in) cursors. cursor = wx.Cursor(cnum) # Set the cursors for all the testPanels widgets. [widget.SetCursor(cursor) for widget in self.testPanel.allWidgets] def OnDrawDot(self, evt): # Draw a dot so the user can see where the hotspot is. dc = wx.ClientDC(self.win) dc.SetPen(wx.Pen("RED")) dc.SetBrush(wx.Brush("RED")) pos = evt.GetPosition() dc.DrawCircle(pos.x, pos.y, 3) #-wxPython Demo---------------------------------------------------------------- def runTest(frame, nb, log): win = TestPanel(nb, log) return win overview = """

wx.Cursor

This demo shows the stock mouse cursors that are available to wxPython. """ if __name__ == '__main__': import os import sys import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])