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_MENU : "WXK_MENU",
23
wx.WXK_PAUSE : "WXK_PAUSE",
24
wx.WXK_CAPITAL : "WXK_CAPITAL",
25
#wx.WXK_PRIOR : "WXK_PRIOR",
26
#wx.WXK_NEXT : "WXK_NEXT",
27
wx.WXK_END : "WXK_END",
28
wx.WXK_HOME : "WXK_HOME",
29
wx.WXK_LEFT : "WXK_LEFT",
31
wx.WXK_RIGHT : "WXK_RIGHT",
32
wx.WXK_DOWN : "WXK_DOWN",
33
wx.WXK_SELECT : "WXK_SELECT",
34
wx.WXK_PRINT : "WXK_PRINT",
35
wx.WXK_EXECUTE : "WXK_EXECUTE",
36
wx.WXK_SNAPSHOT : "WXK_SNAPSHOT",
37
wx.WXK_INSERT : "WXK_INSERT",
38
wx.WXK_HELP : "WXK_HELP",
39
wx.WXK_NUMPAD0 : "WXK_NUMPAD0",
40
wx.WXK_NUMPAD1 : "WXK_NUMPAD1",
41
wx.WXK_NUMPAD2 : "WXK_NUMPAD2",
42
wx.WXK_NUMPAD3 : "WXK_NUMPAD3",
43
wx.WXK_NUMPAD4 : "WXK_NUMPAD4",
44
wx.WXK_NUMPAD5 : "WXK_NUMPAD5",
45
wx.WXK_NUMPAD6 : "WXK_NUMPAD6",
46
wx.WXK_NUMPAD7 : "WXK_NUMPAD7",
47
wx.WXK_NUMPAD8 : "WXK_NUMPAD8",
48
wx.WXK_NUMPAD9 : "WXK_NUMPAD9",
49
wx.WXK_MULTIPLY : "WXK_MULTIPLY",
50
wx.WXK_ADD : "WXK_ADD",
51
wx.WXK_SEPARATOR : "WXK_SEPARATOR",
52
wx.WXK_SUBTRACT : "WXK_SUBTRACT",
53
wx.WXK_DECIMAL : "WXK_DECIMAL",
54
wx.WXK_DIVIDE : "WXK_DIVIDE",
64
wx.WXK_F10 : "WXK_F10",
65
wx.WXK_F11 : "WXK_F11",
66
wx.WXK_F12 : "WXK_F12",
67
wx.WXK_F13 : "WXK_F13",
68
wx.WXK_F14 : "WXK_F14",
69
wx.WXK_F15 : "WXK_F15",
70
wx.WXK_F16 : "WXK_F16",
71
wx.WXK_F17 : "WXK_F17",
72
wx.WXK_F18 : "WXK_F18",
73
wx.WXK_F19 : "WXK_F19",
74
wx.WXK_F20 : "WXK_F20",
75
wx.WXK_F21 : "WXK_F21",
76
wx.WXK_F22 : "WXK_F22",
77
wx.WXK_F23 : "WXK_F23",
78
wx.WXK_F24 : "WXK_F24",
79
wx.WXK_NUMLOCK : "WXK_NUMLOCK",
80
wx.WXK_SCROLL : "WXK_SCROLL",
81
wx.WXK_PAGEUP : "WXK_PAGEUP",
82
wx.WXK_PAGEDOWN : "WXK_PAGEDOWN",
83
wx.WXK_NUMPAD_SPACE : "WXK_NUMPAD_SPACE",
84
wx.WXK_NUMPAD_TAB : "WXK_NUMPAD_TAB",
85
wx.WXK_NUMPAD_ENTER : "WXK_NUMPAD_ENTER",
86
wx.WXK_NUMPAD_F1 : "WXK_NUMPAD_F1",
87
wx.WXK_NUMPAD_F2 : "WXK_NUMPAD_F2",
88
wx.WXK_NUMPAD_F3 : "WXK_NUMPAD_F3",
89
wx.WXK_NUMPAD_F4 : "WXK_NUMPAD_F4",
90
wx.WXK_NUMPAD_HOME : "WXK_NUMPAD_HOME",
91
wx.WXK_NUMPAD_LEFT : "WXK_NUMPAD_LEFT",
92
wx.WXK_NUMPAD_UP : "WXK_NUMPAD_UP",
93
wx.WXK_NUMPAD_RIGHT : "WXK_NUMPAD_RIGHT",
94
wx.WXK_NUMPAD_DOWN : "WXK_NUMPAD_DOWN",
95
#wx.WXK_NUMPAD_PRIOR : "WXK_NUMPAD_PRIOR",
96
wx.WXK_NUMPAD_PAGEUP : "WXK_NUMPAD_PAGEUP",
97
#wx.WXK_NUMPAD_NEXT : "WXK_NUMPAD_NEXT",
98
wx.WXK_NUMPAD_PAGEDOWN : "WXK_NUMPAD_PAGEDOWN",
99
wx.WXK_NUMPAD_END : "WXK_NUMPAD_END",
100
wx.WXK_NUMPAD_BEGIN : "WXK_NUMPAD_BEGIN",
101
wx.WXK_NUMPAD_INSERT : "WXK_NUMPAD_INSERT",
102
wx.WXK_NUMPAD_DELETE : "WXK_NUMPAD_DELETE",
103
wx.WXK_NUMPAD_EQUAL : "WXK_NUMPAD_EQUAL",
104
wx.WXK_NUMPAD_MULTIPLY : "WXK_NUMPAD_MULTIPLY",
105
wx.WXK_NUMPAD_ADD : "WXK_NUMPAD_ADD",
106
wx.WXK_NUMPAD_SEPARATOR : "WXK_NUMPAD_SEPARATOR",
107
wx.WXK_NUMPAD_SUBTRACT : "WXK_NUMPAD_SUBTRACT",
108
wx.WXK_NUMPAD_DECIMAL : "WXK_NUMPAD_DECIMAL",
109
wx.WXK_NUMPAD_DIVIDE : "WXK_NUMPAD_DIVIDE",
111
wx.WXK_WINDOWS_LEFT : "WXK_WINDOWS_LEFT",
112
wx.WXK_WINDOWS_RIGHT : "WXK_WINDOWS_RIGHT",
113
wx.WXK_WINDOWS_MENU : "WXK_WINDOWS_MENU",
115
wx.WXK_SPECIAL1 : "WXK_SPECIAL1",
116
wx.WXK_SPECIAL2 : "WXK_SPECIAL2",
117
wx.WXK_SPECIAL3 : "WXK_SPECIAL3",
118
wx.WXK_SPECIAL4 : "WXK_SPECIAL4",
119
wx.WXK_SPECIAL5 : "WXK_SPECIAL5",
120
wx.WXK_SPECIAL6 : "WXK_SPECIAL6",
121
wx.WXK_SPECIAL7 : "WXK_SPECIAL7",
122
wx.WXK_SPECIAL8 : "WXK_SPECIAL8",
123
wx.WXK_SPECIAL9 : "WXK_SPECIAL9",
124
wx.WXK_SPECIAL10 : "WXK_SPECIAL10",
125
wx.WXK_SPECIAL11 : "WXK_SPECIAL11",
126
wx.WXK_SPECIAL12 : "WXK_SPECIAL12",
127
wx.WXK_SPECIAL13 : "WXK_SPECIAL13",
128
wx.WXK_SPECIAL14 : "WXK_SPECIAL14",
129
wx.WXK_SPECIAL15 : "WXK_SPECIAL15",
130
wx.WXK_SPECIAL16 : "WXK_SPECIAL16",
131
wx.WXK_SPECIAL17 : "WXK_SPECIAL17",
132
wx.WXK_SPECIAL18 : "WXK_SPECIAL18",
133
wx.WXK_SPECIAL19 : "WXK_SPECIAL19",
134
wx.WXK_SPECIAL2 : "WXK_SPECIAL2",
137
if 'wxMac' in wx.PlatformInfo:
138
keyMap[wx.WXK_RAW_CONTROL] = 'WXK_RAW_CONTROL'
139
keyMap[wx.WXK_CONTROL] = "WXK_CONTROL"
140
keyMap[wx.WXK_COMMAND] = "WXK_COMMAND"
142
keyMap[wx.WXK_COMMAND] = "WXK_COMMAND"
143
keyMap[wx.WXK_CONTROL] = "WXK_CONTROL"
146
#----------------------------------------------------------------------
148
class KeySink(wx.Window):
149
def __init__(self, parent):
150
wx.Window.__init__(self, parent, -1, style=wx.WANTS_CHARS
155
self.SetBackgroundColour(wx.BLUE)
156
self.haveFocus = False
162
self.Bind(wx.EVT_PAINT, self.OnPaint)
163
self.Bind(wx.EVT_SET_FOCUS, self.OnSetFocus)
164
self.Bind(wx.EVT_KILL_FOCUS, self.OnKillFocus)
165
self.Bind(wx.EVT_MOUSE_EVENTS, self.OnMouse)
167
self.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
168
self.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
169
self.Bind(wx.EVT_CHAR, self.OnChar)
172
def SetCallSkip(self, skip):
175
def SetLogKeyUp(self, val):
178
def SetLogKeyDn(self, val):
181
def SetLogChar(self, val):
185
def OnPaint(self, evt):
186
dc = wx.PaintDC(self)
187
rect = self.GetClientRect()
188
dc.SetTextForeground(wx.WHITE)
189
dc.DrawLabel("Click here and then press some keys",
190
rect, wx.ALIGN_CENTER | wx.ALIGN_TOP)
192
dc.SetTextForeground(wx.GREEN)
193
dc.DrawLabel("Have Focus", rect, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
195
dc.SetTextForeground(wx.RED)
196
dc.DrawLabel("Need Focus!", rect, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
199
def OnSetFocus(self, evt):
200
self.haveFocus = True
203
def OnKillFocus(self, evt):
204
self.haveFocus = False
207
def OnMouse(self, evt):
212
def OnKeyDown(self, evt):
214
self.GetParent().keylog.LogKeyEvent("KeyDown", evt)
218
def OnKeyUp(self, evt):
220
self.GetParent().keylog.LogKeyEvent("KeyUp", evt)
224
def OnChar(self, evt):
226
self.GetParent().keylog.LogKeyEvent("Char", evt)
229
#----------------------------------------------------------------------
231
class KeyLog(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
232
colHeaders = [ "Event Type",
242
def __init__(self, parent):
243
wx.ListCtrl.__init__(self, parent, -1,
244
style = wx.LC_REPORT|wx.LC_VRULES|wx.LC_HRULES)
245
listmix.ListCtrlAutoWidthMixin.__init__(self)
247
for idx, header in enumerate(self.colHeaders):
248
self.InsertColumn(idx, header)
250
self.InsertColumn(idx, "")
253
self.SetColumnWidth(x, wx.LIST_AUTOSIZE_USEHEADER)
255
self.SetColumnWidth(1, 125)
258
def LogKeyEvent(self, evType, evt):
259
keycode = evt.GetKeyCode()
260
keyname = keyMap.get(keycode, None)
267
keyname = u"Ctrl-%s" % unichr(ord('A') + keycode-1)
269
keyname = u"\"%s\"" % unichr(keycode)
271
keyname = u"(%s)" % keycode
274
if "unicode" in wx.PlatformInfo:
275
UniChr = "\"" + unichr(evt.GetUnicodeKey()) + "\""
278
for mod, ch in [(evt.ControlDown(), 'C'),
279
(evt.AltDown(), 'A'),
280
(evt.ShiftDown(), 'S'),
281
(evt.MetaDown(), 'M'),
282
(evt.RawControlDown(), 'R'),]:
288
id = self.InsertStringItem(self.GetItemCount(), evType)
289
self.SetStringItem(id, 1, keyname)
290
self.SetStringItem(id, 2, str(keycode))
291
self.SetStringItem(id, 3, modifiers)
292
self.SetStringItem(id, 4, str(evt.GetUnicodeKey()))
293
self.SetStringItem(id, 5, UniChr)
294
self.SetStringItem(id, 6, str(evt.GetRawKeyCode()))
295
self.SetStringItem(id, 7, str(evt.GetRawKeyFlags()))
297
#print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
299
self.EnsureVisible(id)
303
self.DeleteAllItems()
306
# build a newline and tab delimited string to put into the clipboard
307
if "unicode" in wx.PlatformInfo:
311
for h in self.colHeaders:
315
for idx in range(self.GetItemCount()):
316
for col in range(self.GetColumnCount()):
317
item = self.GetItem(idx, col)
318
st += item.GetText() + "\t"
321
data = wx.TextDataObject()
323
if wx.TheClipboard.Open():
324
wx.TheClipboard.SetData(data)
325
wx.TheClipboard.Close()
327
wx.MessageBox("Unable to open the clipboard", "Error")
332
#----------------------------------------------------------------------
335
class TestPanel(wx.Panel):
336
def __init__(self, parent, log):
338
wx.Panel.__init__(self, parent, -1, style=0)
339
self.keysink = KeySink(self)
340
self.keysink.SetMinSize((100, 65))
341
self.keylog = KeyLog(self)
343
btn = wx.Button(self, -1, "Clear", style=wx.BU_EXACTFIT)
344
self.Bind(wx.EVT_BUTTON, self.OnClearBtn, btn)
345
btn.SetToolTipString(
346
"Clear the items from the log window")
348
btn2 = wx.Button(self, -1, "Copy", style=wx.BU_EXACTFIT)
349
self.Bind(wx.EVT_BUTTON, self.OnCopyBtn, btn2)
350
btn2.SetToolTipString(
351
"Copy the contents of the log window to the clipboard")
353
cb1 = wx.CheckBox(self, -1, "Call evt.Skip in Key* events")
354
self.Bind(wx.EVT_CHECKBOX, self.OnSkipCB, cb1)
357
cb2 = wx.CheckBox(self, -1, "KEY_UP")
358
self.Bind(wx.EVT_CHECKBOX, self.OnKeyUpCB, cb2)
361
cb3 = wx.CheckBox(self, -1, "KEY_DOWN")
362
self.Bind(wx.EVT_CHECKBOX, self.OnKeyDnCB, cb3)
365
cb4 = wx.CheckBox(self, -1, "CHAR")
366
self.Bind(wx.EVT_CHECKBOX, self.OnCharCB, cb4)
369
buttons = wx.BoxSizer(wx.HORIZONTAL)
370
buttons.Add(btn, 0, wx.ALL, 4)
371
buttons.Add(btn2, 0, wx.ALL, 4)
372
buttons.Add(cb1, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT|wx.RIGHT, 6)
373
buttons.Add(cb2, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT, 6)
374
buttons.Add(cb3, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT, 6)
375
buttons.Add(cb4, 0, wx.ALIGN_CENTER_VERTICAL|wx.LEFT, 6)
377
sizer = wx.BoxSizer(wx.VERTICAL)
378
sizer.Add(self.keysink, 0, wx.GROW)
380
sizer.Add(self.keylog, 1, wx.GROW)
385
def OnClearBtn(self, evt):
386
self.keylog.ClearLog()
388
def OnCopyBtn(self, evt):
389
self.keylog.CopyLog()
391
def OnSkipCB(self, evt):
392
self.keysink.SetCallSkip(evt.GetInt())
394
def OnKeyUpCB(self, evt):
395
self.keysink.SetLogKeyUp(evt.GetInt())
397
def OnKeyDnCB(self, evt):
398
self.keysink.SetLogKeyDn(evt.GetInt())
400
def OnCharCB(self, evt):
401
self.keysink.SetLogChar(evt.GetInt())
404
#----------------------------------------------------------------------
406
def runTest(frame, nb, log):
407
win = TestPanel(nb, log)
410
#----------------------------------------------------------------------
414
overview = """<html><body>
415
<h2><center>wxKeyEvents</center></h2>
417
This demo simply catches all key events and prints info about them.
418
It is meant to be used as a compatibility test for cross platform work.
425
if __name__ == '__main__':
428
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])