]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/KeyEvents.py
   3 import  wx
.lib
.mixins
.listctrl  
as  listmix
 
   5 #---------------------------------------------------------------------- 
   8     wx
.WXK_BACK 
: "wx.WXK_BACK", 
   9     wx
.WXK_TAB 
: "wx.WXK_TAB", 
  10     wx
.WXK_RETURN 
: "wx.WXK_RETURN", 
  11     wx
.WXK_ESCAPE 
: "wx.WXK_ESCAPE", 
  12     wx
.WXK_SPACE 
: "wx.WXK_SPACE", 
  13     wx
.WXK_DELETE 
: "wx.WXK_DELETE", 
  14     wx
.WXK_START 
: "wx.WXK_START", 
  15     wx
.WXK_LBUTTON 
: "wx.WXK_LBUTTON", 
  16     wx
.WXK_RBUTTON 
: "wx.WXK_RBUTTON", 
  17     wx
.WXK_CANCEL 
: "wx.WXK_CANCEL", 
  18     wx
.WXK_MBUTTON 
: "wx.WXK_MBUTTON", 
  19     wx
.WXK_CLEAR 
: "wx.WXK_CLEAR", 
  20     wx
.WXK_SHIFT 
: "wx.WXK_SHIFT", 
  21     wx
.WXK_ALT 
: "wx.WXK_ALT", 
  22     wx
.WXK_CONTROL 
: "wx.WXK_CONTROL", 
  23     wx
.WXK_MENU 
: "wx.WXK_MENU", 
  24     wx
.WXK_PAUSE 
: "wx.WXK_PAUSE", 
  25     wx
.WXK_CAPITAL 
: "wx.WXK_CAPITAL", 
  26     wx
.WXK_PRIOR 
: "wx.WXK_PRIOR", 
  27     wx
.WXK_NEXT 
: "wx.WXK_NEXT", 
  28     wx
.WXK_END 
: "wx.WXK_END", 
  29     wx
.WXK_HOME 
: "wx.WXK_HOME", 
  30     wx
.WXK_LEFT 
: "wx.WXK_LEFT", 
  31     wx
.WXK_UP 
: "wx.WXK_UP", 
  32     wx
.WXK_RIGHT 
: "wx.WXK_RIGHT", 
  33     wx
.WXK_DOWN 
: "wx.WXK_DOWN", 
  34     wx
.WXK_SELECT 
: "wx.WXK_SELECT", 
  35     wx
.WXK_PRINT 
: "wx.WXK_PRINT", 
  36     wx
.WXK_EXECUTE 
: "wx.WXK_EXECUTE", 
  37     wx
.WXK_SNAPSHOT 
: "wx.WXK_SNAPSHOT", 
  38     wx
.WXK_INSERT 
: "wx.WXK_INSERT", 
  39     wx
.WXK_HELP 
: "wx.WXK_HELP", 
  40     wx
.WXK_NUMPAD0 
: "wx.WXK_NUMPAD0", 
  41     wx
.WXK_NUMPAD1 
: "wx.WXK_NUMPAD1", 
  42     wx
.WXK_NUMPAD2 
: "wx.WXK_NUMPAD2", 
  43     wx
.WXK_NUMPAD3 
: "wx.WXK_NUMPAD3", 
  44     wx
.WXK_NUMPAD4 
: "wx.WXK_NUMPAD4", 
  45     wx
.WXK_NUMPAD5 
: "wx.WXK_NUMPAD5", 
  46     wx
.WXK_NUMPAD6 
: "wx.WXK_NUMPAD6", 
  47     wx
.WXK_NUMPAD7 
: "wx.WXK_NUMPAD7", 
  48     wx
.WXK_NUMPAD8 
: "wx.WXK_NUMPAD8", 
  49     wx
.WXK_NUMPAD9 
: "wx.WXK_NUMPAD9", 
  50     wx
.WXK_MULTIPLY 
: "wx.WXK_MULTIPLY", 
  51     wx
.WXK_ADD 
: "wx.WXK_ADD", 
  52     wx
.WXK_SEPARATOR 
: "wx.WXK_SEPARATOR", 
  53     wx
.WXK_SUBTRACT 
: "wx.WXK_SUBTRACT", 
  54     wx
.WXK_DECIMAL 
: "wx.WXK_DECIMAL", 
  55     wx
.WXK_DIVIDE 
: "wx.WXK_DIVIDE", 
  56     wx
.WXK_F1 
: "wx.WXK_F1", 
  57     wx
.WXK_F2 
: "wx.WXK_F2", 
  58     wx
.WXK_F3 
: "wx.WXK_F3", 
  59     wx
.WXK_F4 
: "wx.WXK_F4", 
  60     wx
.WXK_F5 
: "wx.WXK_F5", 
  61     wx
.WXK_F6 
: "wx.WXK_F6", 
  62     wx
.WXK_F7 
: "wx.WXK_F7", 
  63     wx
.WXK_F8 
: "wx.WXK_F8", 
  64     wx
.WXK_F9 
: "wx.WXK_F9", 
  65     wx
.WXK_F10 
: "wx.WXK_F10", 
  66     wx
.WXK_F11 
: "wx.WXK_F11", 
  67     wx
.WXK_F12 
: "wx.WXK_F12", 
  68     wx
.WXK_F13 
: "wx.WXK_F13", 
  69     wx
.WXK_F14 
: "wx.WXK_F14", 
  70     wx
.WXK_F15 
: "wx.WXK_F15", 
  71     wx
.WXK_F16 
: "wx.WXK_F16", 
  72     wx
.WXK_F17 
: "wx.WXK_F17", 
  73     wx
.WXK_F18 
: "wx.WXK_F18", 
  74     wx
.WXK_F19 
: "wx.WXK_F19", 
  75     wx
.WXK_F20 
: "wx.WXK_F20", 
  76     wx
.WXK_F21 
: "wx.WXK_F21", 
  77     wx
.WXK_F22 
: "wx.WXK_F22", 
  78     wx
.WXK_F23 
: "wx.WXK_F23", 
  79     wx
.WXK_F24 
: "wx.WXK_F24", 
  80     wx
.WXK_NUMLOCK 
: "wx.WXK_NUMLOCK", 
  81     wx
.WXK_SCROLL 
: "wx.WXK_SCROLL", 
  82     wx
.WXK_PAGEUP 
: "wx.WXK_PAGEUP", 
  83     wx
.WXK_PAGEDOWN 
: "wx.WXK_PAGEDOWN", 
  84     wx
.WXK_NUMPAD_SPACE 
: "wx.WXK_NUMPAD_SPACE", 
  85     wx
.WXK_NUMPAD_TAB 
: "wx.WXK_NUMPAD_TAB", 
  86     wx
.WXK_NUMPAD_ENTER 
: "wx.WXK_NUMPAD_ENTER", 
  87     wx
.WXK_NUMPAD_F1 
: "wx.WXK_NUMPAD_F1", 
  88     wx
.WXK_NUMPAD_F2 
: "wx.WXK_NUMPAD_F2", 
  89     wx
.WXK_NUMPAD_F3 
: "wx.WXK_NUMPAD_F3", 
  90     wx
.WXK_NUMPAD_F4 
: "wx.WXK_NUMPAD_F4", 
  91     wx
.WXK_NUMPAD_HOME 
: "wx.WXK_NUMPAD_HOME", 
  92     wx
.WXK_NUMPAD_LEFT 
: "wx.WXK_NUMPAD_LEFT", 
  93     wx
.WXK_NUMPAD_UP 
: "wx.WXK_NUMPAD_UP", 
  94     wx
.WXK_NUMPAD_RIGHT 
: "wx.WXK_NUMPAD_RIGHT", 
  95     wx
.WXK_NUMPAD_DOWN 
: "wx.WXK_NUMPAD_DOWN", 
  96     wx
.WXK_NUMPAD_PRIOR 
: "wx.WXK_NUMPAD_PRIOR", 
  97     wx
.WXK_NUMPAD_PAGEUP 
: "wx.WXK_NUMPAD_PAGEUP", 
  98     wx
.WXK_NUMPAD_NEXT 
: "wx.WXK_NUMPAD_NEXT", 
  99     wx
.WXK_NUMPAD_PAGEDOWN 
: "wx.WXK_NUMPAD_PAGEDOWN", 
 100     wx
.WXK_NUMPAD_END 
: "wx.WXK_NUMPAD_END", 
 101     wx
.WXK_NUMPAD_BEGIN 
: "wx.WXK_NUMPAD_BEGIN", 
 102     wx
.WXK_NUMPAD_INSERT 
: "wx.WXK_NUMPAD_INSERT", 
 103     wx
.WXK_NUMPAD_DELETE 
: "wx.WXK_NUMPAD_DELETE", 
 104     wx
.WXK_NUMPAD_EQUAL 
: "wx.WXK_NUMPAD_EQUAL", 
 105     wx
.WXK_NUMPAD_MULTIPLY 
: "wx.WXK_NUMPAD_MULTIPLY", 
 106     wx
.WXK_NUMPAD_ADD 
: "wx.WXK_NUMPAD_ADD", 
 107     wx
.WXK_NUMPAD_SEPARATOR 
: "wx.WXK_NUMPAD_SEPARATOR", 
 108     wx
.WXK_NUMPAD_SUBTRACT 
: "wx.WXK_NUMPAD_SUBTRACT", 
 109     wx
.WXK_NUMPAD_DECIMAL 
: "wx.WXK_NUMPAD_DECIMAL", 
 110     wx
.WXK_NUMPAD_DIVIDE 
: "wx.WXK_NUMPAD_DIVIDE", 
 114 #---------------------------------------------------------------------- 
 116 class KeySink(wx
.Window
): 
 117     def __init__(self
, parent
): 
 118         wx
.Window
.__init
__(self
, parent
, -1, style
=wx
.WANTS_CHARS
 
 123         self
.SetBackgroundColour(wx
.BLUE
) 
 124         self
.haveFocus 
= False 
 125         self
.callSkip 
= False 
 130         self
.Bind(wx
.EVT_PAINT
, self
.OnPaint
) 
 131         self
.Bind(wx
.EVT_SET_FOCUS
, self
.OnSetFocus
) 
 132         self
.Bind(wx
.EVT_KILL_FOCUS
, self
.OnKillFocus
) 
 133         self
.Bind(wx
.EVT_MOUSE_EVENTS
, self
.OnMouse
) 
 135         self
.Bind(wx
.EVT_KEY_DOWN
, self
.OnKeyDown
) 
 136         self
.Bind(wx
.EVT_KEY_UP
, self
.OnKeyUp
) 
 137         self
.Bind(wx
.EVT_CHAR
, self
.OnChar
) 
 140     def SetCallSkip(self
, skip
): 
 143     def SetLogKeyUp(self
, val
): 
 146     def SetLogKeyDn(self
, val
): 
 149     def SetLogChar(self
, val
): 
 153     def OnPaint(self
, evt
): 
 154         dc 
= wx
.PaintDC(self
) 
 155         rect 
= self
.GetClientRect() 
 156         dc
.SetTextForeground(wx
.WHITE
) 
 157         dc
.DrawLabel("Click here and then press some keys", 
 158                      rect
, wx
.ALIGN_CENTER | wx
.ALIGN_TOP
) 
 160             dc
.SetTextForeground(wx
.GREEN
) 
 161             dc
.DrawLabel("Have Focus", rect
, wx
.ALIGN_RIGHT | wx
.ALIGN_BOTTOM
) 
 163             dc
.SetTextForeground(wx
.RED
) 
 164             dc
.DrawLabel("Need Focus!", rect
, wx
.ALIGN_RIGHT | wx
.ALIGN_BOTTOM
) 
 167     def OnSetFocus(self
, evt
): 
 168         self
.haveFocus 
= True 
 171     def OnKillFocus(self
, evt
): 
 172         self
.haveFocus 
= False 
 175     def OnMouse(self
, evt
): 
 180     def OnKeyDown(self
, evt
): 
 182             self
.GetParent().keylog
.LogKeyEvent("KeyDown", evt
) 
 186     def OnKeyUp(self
, evt
): 
 188             self
.GetParent().keylog
.LogKeyEvent("KeyUp", evt
) 
 192     def OnChar(self
, evt
): 
 194             self
.GetParent().keylog
.LogKeyEvent("Char", evt
) 
 197 #---------------------------------------------------------------------- 
 199 class KeyLog(wx
.ListCtrl
, listmix
.ListCtrlAutoWidthMixin
): 
 201     def __init__(self
, parent
): 
 202         wx
.ListCtrl
.__init
__(self
, parent
, -1, 
 203                             style 
= wx
.LC_REPORT|wx
.LC_VRULES|wx
.LC_HRULES
) 
 204         listmix
.ListCtrlAutoWidthMixin
.__init
__(self
) 
 206         self
.InsertColumn(0, "Event Type") 
 207         self
.InsertColumn(1, "Key Name") 
 208         self
.InsertColumn(2, "Key Code") 
 209         self
.InsertColumn(3, "Modifiers") 
 210         self
.InsertColumn(4, "RawKeyCode") 
 211         self
.InsertColumn(5, "RawKeyFlags") 
 212         self
.InsertColumn(6, "") 
 215             self
.SetColumnWidth(x
, wx
.LIST_AUTOSIZE_USEHEADER
) 
 217         self
.SetColumnWidth(1, 125) 
 220     def LogKeyEvent(self
, evType
, evt
): 
 221         keycode 
= evt
.GetKeyCode() 
 222         keyname 
= keyMap
.get(keycode
, None) 
 228                     keyname 
= "Ctrl-%s" % chr(ord('A') + keycode
-1) 
 230                     keyname 
= "\"%s\"" % chr(keycode
) 
 232                 keyname 
= "unknown (%s)" % keycode
 
 235         for mod
, ch 
in [(evt
.ControlDown(), 'C'), 
 236                         (evt
.AltDown(),     'A'), 
 237                         (evt
.ShiftDown(),   'S'), 
 238                         (evt
.MetaDown(),    'M')]: 
 244         id = self
.InsertStringItem(self
.GetItemCount(), evType
) 
 245         self
.SetStringItem(id, 1, keyname
) 
 246         self
.SetStringItem(id, 2, str(keycode
)) 
 247         self
.SetStringItem(id, 3, modifiers
) 
 248         self
.SetStringItem(id, 4, str(evt
.GetRawKeyCode())) 
 249         self
.SetStringItem(id, 5, str(evt
.GetRawKeyFlags())) 
 251         #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags())) 
 253         self
.EnsureVisible(id) 
 257         self
.DeleteAllItems() 
 260 #---------------------------------------------------------------------- 
 263 class TestPanel(wx
.Panel
): 
 264     def __init__(self
, parent
, log
): 
 266         wx
.Panel
.__init
__(self
, parent
, -1, style
=0) 
 267         self
.keysink 
= KeySink(self
) 
 268         self
.keysink
.SetSize((100, 65)) 
 269         self
.keylog 
= KeyLog(self
) 
 271         btn 
= wx
.Button(self
, -1, "Clear Log") 
 272         self
.Bind(wx
.EVT_BUTTON
, self
.OnClearBtn
, btn
) 
 274         cb1 
= wx
.CheckBox(self
, -1, "Call evt.Skip for Key Up/Dn events") 
 275         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnSkipCB
, cb1
) 
 277         cb2 
= wx
.CheckBox(self
, -1, "EVT_KEY_UP") 
 278         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyUpCB
, cb2
) 
 281         cb3 
= wx
.CheckBox(self
, -1, "EVT_KEY_DOWN") 
 282         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyDnCB
, cb3
) 
 285         cb4 
= wx
.CheckBox(self
, -1, "EVT_CHAR") 
 286         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnCharCB
, cb4
) 
 289         buttons 
= wx
.BoxSizer(wx
.HORIZONTAL
) 
 290         buttons
.Add(btn
, 0, wx
.ALL
, 4) 
 291         buttons
.Add(cb1
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT|wx
.RIGHT
, 6) 
 292         buttons
.Add(cb2
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 293         buttons
.Add(cb3
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 294         buttons
.Add(cb4
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 296         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 297         sizer
.Add(self
.keysink
, 0, wx
.GROW
) 
 299         sizer
.Add(self
.keylog
, 1, wx
.GROW
) 
 304     def OnClearBtn(self
, evt
): 
 305         self
.keylog
.ClearLog() 
 307     def OnSkipCB(self
, evt
): 
 308         self
.keysink
.SetCallSkip(evt
.GetInt()) 
 310     def OnKeyUpCB(self
, evt
): 
 311         self
.keysink
.SetLogKeyUp(evt
.GetInt()) 
 313     def OnKeyDnCB(self
, evt
): 
 314         self
.keysink
.SetLogKeyDn(evt
.GetInt()) 
 316     def OnCharCB(self
, evt
): 
 317         self
.keysink
.SetLogChar(evt
.GetInt()) 
 320 #---------------------------------------------------------------------- 
 322 def runTest(frame
, nb
, log
): 
 323     win 
= TestPanel(nb
, log
) 
 326 #---------------------------------------------------------------------- 
 330 overview 
= """<html><body> 
 331 <h2><center>wxKeyEvents</center></h2> 
 333 This demo simply catches all key events and prints info about them. 
 334 It is meant to be used as a compatibility test for cross platform work. 
 341 if __name__ 
== '__main__': 
 344     run
.main(['', os
.path
.basename(sys
.argv
[0])])