]>
git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/KeyEvents.py
1ca318a327aef5df669064090f0cff8b43b5c1d3
   3 import  wx
.lib
.mixins
.listctrl  
as  listmix
 
   5 #---------------------------------------------------------------------- 
   8     wx
.WXK_BACK 
: "WXK_BACK", 
   9     wx
.WXK_TAB 
: "WXK_TAB", 
  10     wx
.WXK_RETURN 
: "WXK_RETURN", 
  11     wx
.WXK_ESCAPE 
: "WXK_ESCAPE", 
  12     wx
.WXK_SPACE 
: "WXK_SPACE", 
  13     wx
.WXK_DELETE 
: "WXK_DELETE", 
  14     wx
.WXK_START 
: "WXK_START", 
  15     wx
.WXK_LBUTTON 
: "WXK_LBUTTON", 
  16     wx
.WXK_RBUTTON 
: "WXK_RBUTTON", 
  17     wx
.WXK_CANCEL 
: "WXK_CANCEL", 
  18     wx
.WXK_MBUTTON 
: "WXK_MBUTTON", 
  19     wx
.WXK_CLEAR 
: "WXK_CLEAR", 
  20     wx
.WXK_SHIFT 
: "WXK_SHIFT", 
  21     wx
.WXK_ALT 
: "WXK_ALT", 
  22     wx
.WXK_CONTROL 
: "WXK_CONTROL", 
  23     wx
.WXK_MENU 
: "WXK_MENU", 
  24     wx
.WXK_PAUSE 
: "WXK_PAUSE", 
  25     wx
.WXK_CAPITAL 
: "WXK_CAPITAL", 
  26     wx
.WXK_PRIOR 
: "WXK_PRIOR", 
  27     wx
.WXK_NEXT 
: "WXK_NEXT", 
  28     wx
.WXK_END 
: "WXK_END", 
  29     wx
.WXK_HOME 
: "WXK_HOME", 
  30     wx
.WXK_LEFT 
: "WXK_LEFT", 
  32     wx
.WXK_RIGHT 
: "WXK_RIGHT", 
  33     wx
.WXK_DOWN 
: "WXK_DOWN", 
  34     wx
.WXK_SELECT 
: "WXK_SELECT", 
  35     wx
.WXK_PRINT 
: "WXK_PRINT", 
  36     wx
.WXK_EXECUTE 
: "WXK_EXECUTE", 
  37     wx
.WXK_SNAPSHOT 
: "WXK_SNAPSHOT", 
  38     wx
.WXK_INSERT 
: "WXK_INSERT", 
  39     wx
.WXK_HELP 
: "WXK_HELP", 
  40     wx
.WXK_NUMPAD0 
: "WXK_NUMPAD0", 
  41     wx
.WXK_NUMPAD1 
: "WXK_NUMPAD1", 
  42     wx
.WXK_NUMPAD2 
: "WXK_NUMPAD2", 
  43     wx
.WXK_NUMPAD3 
: "WXK_NUMPAD3", 
  44     wx
.WXK_NUMPAD4 
: "WXK_NUMPAD4", 
  45     wx
.WXK_NUMPAD5 
: "WXK_NUMPAD5", 
  46     wx
.WXK_NUMPAD6 
: "WXK_NUMPAD6", 
  47     wx
.WXK_NUMPAD7 
: "WXK_NUMPAD7", 
  48     wx
.WXK_NUMPAD8 
: "WXK_NUMPAD8", 
  49     wx
.WXK_NUMPAD9 
: "WXK_NUMPAD9", 
  50     wx
.WXK_MULTIPLY 
: "WXK_MULTIPLY", 
  51     wx
.WXK_ADD 
: "WXK_ADD", 
  52     wx
.WXK_SEPARATOR 
: "WXK_SEPARATOR", 
  53     wx
.WXK_SUBTRACT 
: "WXK_SUBTRACT", 
  54     wx
.WXK_DECIMAL 
: "WXK_DECIMAL", 
  55     wx
.WXK_DIVIDE 
: "WXK_DIVIDE", 
  65     wx
.WXK_F10 
: "WXK_F10", 
  66     wx
.WXK_F11 
: "WXK_F11", 
  67     wx
.WXK_F12 
: "WXK_F12", 
  68     wx
.WXK_F13 
: "WXK_F13", 
  69     wx
.WXK_F14 
: "WXK_F14", 
  70     wx
.WXK_F15 
: "WXK_F15", 
  71     wx
.WXK_F16 
: "WXK_F16", 
  72     wx
.WXK_F17 
: "WXK_F17", 
  73     wx
.WXK_F18 
: "WXK_F18", 
  74     wx
.WXK_F19 
: "WXK_F19", 
  75     wx
.WXK_F20 
: "WXK_F20", 
  76     wx
.WXK_F21 
: "WXK_F21", 
  77     wx
.WXK_F22 
: "WXK_F22", 
  78     wx
.WXK_F23 
: "WXK_F23", 
  79     wx
.WXK_F24 
: "WXK_F24", 
  80     wx
.WXK_NUMLOCK 
: "WXK_NUMLOCK", 
  81     wx
.WXK_SCROLL 
: "WXK_SCROLL", 
  82     wx
.WXK_PAGEUP 
: "WXK_PAGEUP", 
  83     wx
.WXK_PAGEDOWN 
: "WXK_PAGEDOWN", 
  84     wx
.WXK_NUMPAD_SPACE 
: "WXK_NUMPAD_SPACE", 
  85     wx
.WXK_NUMPAD_TAB 
: "WXK_NUMPAD_TAB", 
  86     wx
.WXK_NUMPAD_ENTER 
: "WXK_NUMPAD_ENTER", 
  87     wx
.WXK_NUMPAD_F1 
: "WXK_NUMPAD_F1", 
  88     wx
.WXK_NUMPAD_F2 
: "WXK_NUMPAD_F2", 
  89     wx
.WXK_NUMPAD_F3 
: "WXK_NUMPAD_F3", 
  90     wx
.WXK_NUMPAD_F4 
: "WXK_NUMPAD_F4", 
  91     wx
.WXK_NUMPAD_HOME 
: "WXK_NUMPAD_HOME", 
  92     wx
.WXK_NUMPAD_LEFT 
: "WXK_NUMPAD_LEFT", 
  93     wx
.WXK_NUMPAD_UP 
: "WXK_NUMPAD_UP", 
  94     wx
.WXK_NUMPAD_RIGHT 
: "WXK_NUMPAD_RIGHT", 
  95     wx
.WXK_NUMPAD_DOWN 
: "WXK_NUMPAD_DOWN", 
  96     wx
.WXK_NUMPAD_PRIOR 
: "WXK_NUMPAD_PRIOR", 
  97     wx
.WXK_NUMPAD_PAGEUP 
: "WXK_NUMPAD_PAGEUP", 
  98     wx
.WXK_NUMPAD_NEXT 
: "WXK_NUMPAD_NEXT", 
  99     wx
.WXK_NUMPAD_PAGEDOWN 
: "WXK_NUMPAD_PAGEDOWN", 
 100     wx
.WXK_NUMPAD_END 
: "WXK_NUMPAD_END", 
 101     wx
.WXK_NUMPAD_BEGIN 
: "WXK_NUMPAD_BEGIN", 
 102     wx
.WXK_NUMPAD_INSERT 
: "WXK_NUMPAD_INSERT", 
 103     wx
.WXK_NUMPAD_DELETE 
: "WXK_NUMPAD_DELETE", 
 104     wx
.WXK_NUMPAD_EQUAL 
: "WXK_NUMPAD_EQUAL", 
 105     wx
.WXK_NUMPAD_MULTIPLY 
: "WXK_NUMPAD_MULTIPLY", 
 106     wx
.WXK_NUMPAD_ADD 
: "WXK_NUMPAD_ADD", 
 107     wx
.WXK_NUMPAD_SEPARATOR 
: "WXK_NUMPAD_SEPARATOR", 
 108     wx
.WXK_NUMPAD_SUBTRACT 
: "WXK_NUMPAD_SUBTRACT", 
 109     wx
.WXK_NUMPAD_DECIMAL 
: "WXK_NUMPAD_DECIMAL", 
 110     wx
.WXK_NUMPAD_DIVIDE 
: "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
): 
 200     colHeaders 
= [ "Event Type", 
 209     def __init__(self
, parent
): 
 210         wx
.ListCtrl
.__init
__(self
, parent
, -1, 
 211                             style 
= wx
.LC_REPORT|wx
.LC_VRULES|wx
.LC_HRULES
) 
 212         listmix
.ListCtrlAutoWidthMixin
.__init
__(self
) 
 214         for idx
, header 
in enumerate(self
.colHeaders
): 
 215             self
.InsertColumn(idx
, header
) 
 217         self
.InsertColumn(idx
, "") 
 220             self
.SetColumnWidth(x
, wx
.LIST_AUTOSIZE_USEHEADER
) 
 222         self
.SetColumnWidth(1, 125) 
 225     def LogKeyEvent(self
, evType
, evt
): 
 226         keycode 
= evt
.GetKeyCode() 
 227         keyname 
= keyMap
.get(keycode
, None) 
 233                     keyname 
= "Ctrl-%s" % chr(ord('A') + keycode
-1) 
 235                     keyname 
= "\"%s\"" % chr(keycode
) 
 236             elif "unicode" in wx
.PlatformInfo
: 
 237                 keyname 
= "\"" + unichr(keycode
) + "\"" 
 239                 keyname 
= "unknown (%s)" % keycode
 
 242         for mod
, ch 
in [(evt
.ControlDown(), 'C'), 
 243                         (evt
.AltDown(),     'A'), 
 244                         (evt
.ShiftDown(),   'S'), 
 245                         (evt
.MetaDown(),    'M')]: 
 251         id = self
.InsertStringItem(self
.GetItemCount(), evType
) 
 252         self
.SetStringItem(id, 1, keyname
) 
 253         self
.SetStringItem(id, 2, str(keycode
)) 
 254         self
.SetStringItem(id, 3, modifiers
) 
 255         self
.SetStringItem(id, 4, str(evt
.GetUnicodeKey())) 
 256         self
.SetStringItem(id, 5, str(evt
.GetRawKeyCode())) 
 257         self
.SetStringItem(id, 6, str(evt
.GetRawKeyFlags())) 
 259         #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags())) 
 261         self
.EnsureVisible(id) 
 265         self
.DeleteAllItems() 
 268         # build a newline and tab delimited string to put into the clipboard 
 269         if "unicode" in wx
.PlatformInfo
: 
 273         for h 
in self
.colHeaders
: 
 277         for idx 
in range(self
.GetItemCount()): 
 278             for col 
in range(self
.GetColumnCount()): 
 279                 item 
= self
.GetItem(idx
, col
) 
 280                 st 
+= item
.GetText() + "\t" 
 283         data 
= wx
.TextDataObject() 
 285         if wx
.TheClipboard
.Open(): 
 286             wx
.TheClipboard
.SetData(data
) 
 287             wx
.TheClipboard
.Close() 
 289             wx
.MessageBox("Unable to open the clipboard", "Error") 
 294 #---------------------------------------------------------------------- 
 297 class TestPanel(wx
.Panel
): 
 298     def __init__(self
, parent
, log
): 
 300         wx
.Panel
.__init
__(self
, parent
, -1, style
=0) 
 301         self
.keysink 
= KeySink(self
) 
 302         self
.keysink
.SetMinSize((100, 65)) 
 303         self
.keylog 
= KeyLog(self
) 
 305         btn 
= wx
.Button(self
, -1, "Clear", style
=wx
.BU_EXACTFIT
) 
 306         self
.Bind(wx
.EVT_BUTTON
, self
.OnClearBtn
, btn
) 
 307         btn
.SetToolTipString( 
 308             "Clear the items from the log window") 
 310         btn2 
= wx
.Button(self
, -1, "Copy", style
=wx
.BU_EXACTFIT
) 
 311         self
.Bind(wx
.EVT_BUTTON
, self
.OnCopyBtn
, btn2
) 
 312         btn2
.SetToolTipString( 
 313             "Copy the contents of the log window to the clipboard") 
 315         cb1 
= wx
.CheckBox(self
, -1, "Call evt.Skip in Key* events") 
 316         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnSkipCB
, cb1
) 
 318         cb2 
= wx
.CheckBox(self
, -1, "KEY_UP") 
 319         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyUpCB
, cb2
) 
 322         cb3 
= wx
.CheckBox(self
, -1, "KEY_DOWN") 
 323         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyDnCB
, cb3
) 
 326         cb4 
= wx
.CheckBox(self
, -1, "CHAR") 
 327         self
.Bind(wx
.EVT_CHECKBOX
, self
.OnCharCB
, cb4
) 
 330         buttons 
= wx
.BoxSizer(wx
.HORIZONTAL
) 
 331         buttons
.Add(btn
, 0, wx
.ALL
, 4) 
 332         buttons
.Add(btn2
, 0, wx
.ALL
, 4) 
 333         buttons
.Add(cb1
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT|wx
.RIGHT
, 6) 
 334         buttons
.Add(cb2
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 335         buttons
.Add(cb3
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 336         buttons
.Add(cb4
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6) 
 338         sizer 
= wx
.BoxSizer(wx
.VERTICAL
) 
 339         sizer
.Add(self
.keysink
, 0, wx
.GROW
) 
 341         sizer
.Add(self
.keylog
, 1, wx
.GROW
) 
 346     def OnClearBtn(self
, evt
): 
 347         self
.keylog
.ClearLog() 
 349     def OnCopyBtn(self
, evt
): 
 350         self
.keylog
.CopyLog() 
 352     def OnSkipCB(self
, evt
): 
 353         self
.keysink
.SetCallSkip(evt
.GetInt()) 
 355     def OnKeyUpCB(self
, evt
): 
 356         self
.keysink
.SetLogKeyUp(evt
.GetInt()) 
 358     def OnKeyDnCB(self
, evt
): 
 359         self
.keysink
.SetLogKeyDn(evt
.GetInt()) 
 361     def OnCharCB(self
, evt
): 
 362         self
.keysink
.SetLogChar(evt
.GetInt()) 
 365 #---------------------------------------------------------------------- 
 367 def runTest(frame
, nb
, log
): 
 368     win 
= TestPanel(nb
, log
) 
 371 #---------------------------------------------------------------------- 
 375 overview 
= """<html><body> 
 376 <h2><center>wxKeyEvents</center></h2> 
 378 This demo simply catches all key events and prints info about them. 
 379 It is meant to be used as a compatibility test for cross platform work. 
 386 if __name__ 
== '__main__': 
 389     run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])