~brian-sidebotham/wxwidgets-cmake/wxpython-2.9.4

« back to all changes in this revision

Viewing changes to wxPython/demo/KeyEvents.py

  • Committer: Brian Sidebotham
  • Date: 2013-08-03 14:30:08 UTC
  • Revision ID: brian.sidebotham@gmail.com-20130803143008-c7806tkych1tp6fc
Initial import into Bazaar

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
import  wx
 
3
import  wx.lib.mixins.listctrl  as  listmix
 
4
 
 
5
#----------------------------------------------------------------------
 
6
 
 
7
keyMap = {
 
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",
 
30
    wx.WXK_UP : "WXK_UP",
 
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",
 
55
    wx.WXK_F1 : "WXK_F1",
 
56
    wx.WXK_F2 : "WXK_F2",
 
57
    wx.WXK_F3 : "WXK_F3",
 
58
    wx.WXK_F4 : "WXK_F4",
 
59
    wx.WXK_F5 : "WXK_F5",
 
60
    wx.WXK_F6 : "WXK_F6",
 
61
    wx.WXK_F7 : "WXK_F7",
 
62
    wx.WXK_F8 : "WXK_F8",
 
63
    wx.WXK_F9 : "WXK_F9",
 
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",
 
110
 
 
111
    wx.WXK_WINDOWS_LEFT : "WXK_WINDOWS_LEFT",
 
112
    wx.WXK_WINDOWS_RIGHT : "WXK_WINDOWS_RIGHT",
 
113
    wx.WXK_WINDOWS_MENU : "WXK_WINDOWS_MENU",
 
114
 
 
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",
 
135
}
 
136
 
 
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"
 
141
else:
 
142
    keyMap[wx.WXK_COMMAND] = "WXK_COMMAND"
 
143
    keyMap[wx.WXK_CONTROL] = "WXK_CONTROL"
 
144
    
 
145
 
 
146
#----------------------------------------------------------------------
 
147
 
 
148
class KeySink(wx.Window):
 
149
    def __init__(self, parent):
 
150
        wx.Window.__init__(self, parent, -1, style=wx.WANTS_CHARS
 
151
                          #| wx.RAISED_BORDER
 
152
                          #| wx.SUNKEN_BORDER
 
153
                           , name="sink")
 
154
 
 
155
        self.SetBackgroundColour(wx.BLUE)
 
156
        self.haveFocus = False
 
157
        self.callSkip = True
 
158
        self.logKeyDn = True
 
159
        self.logKeyUp = True
 
160
        self.logChar = True
 
161
 
 
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)
 
166
 
 
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)
 
170
 
 
171
 
 
172
    def SetCallSkip(self, skip):
 
173
        self.callSkip = skip
 
174
 
 
175
    def SetLogKeyUp(self, val):
 
176
        self.logKeyUp = val
 
177
 
 
178
    def SetLogKeyDn(self, val):
 
179
        self.logKeyDn = val
 
180
 
 
181
    def SetLogChar(self, val):
 
182
        self.logChar = val
 
183
 
 
184
 
 
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)
 
191
        if self.haveFocus:
 
192
            dc.SetTextForeground(wx.GREEN)
 
193
            dc.DrawLabel("Have Focus", rect, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
 
194
        else:
 
195
            dc.SetTextForeground(wx.RED)
 
196
            dc.DrawLabel("Need Focus!", rect, wx.ALIGN_RIGHT | wx.ALIGN_BOTTOM)
 
197
 
 
198
 
 
199
    def OnSetFocus(self, evt):
 
200
        self.haveFocus = True
 
201
        self.Refresh()
 
202
 
 
203
    def OnKillFocus(self, evt):
 
204
        self.haveFocus = False
 
205
        self.Refresh()
 
206
 
 
207
    def OnMouse(self, evt):
 
208
        if evt.ButtonDown():
 
209
            self.SetFocus()
 
210
 
 
211
 
 
212
    def OnKeyDown(self, evt):
 
213
        if self.logKeyDn:
 
214
            self.GetParent().keylog.LogKeyEvent("KeyDown", evt)
 
215
        if self.callSkip:
 
216
            evt.Skip()
 
217
 
 
218
    def OnKeyUp(self, evt):
 
219
        if self.logKeyUp:
 
220
            self.GetParent().keylog.LogKeyEvent("KeyUp", evt)
 
221
        if self.callSkip:
 
222
            evt.Skip()
 
223
 
 
224
    def OnChar(self, evt):
 
225
        if self.logChar:
 
226
            self.GetParent().keylog.LogKeyEvent("Char", evt)
 
227
 
 
228
 
 
229
#----------------------------------------------------------------------
 
230
 
 
231
class KeyLog(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
 
232
    colHeaders = [ "Event Type",
 
233
                   "Key Name", 
 
234
                   "Key Code",   
 
235
                   "Modifiers",
 
236
                   "Unicode",
 
237
                   "UniChr",
 
238
                   "RawKeyCode",
 
239
                   "RawKeyFlags",
 
240
                   ]     
 
241
 
 
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)
 
246
 
 
247
        for idx, header in enumerate(self.colHeaders):
 
248
            self.InsertColumn(idx, header)
 
249
        idx += 1
 
250
        self.InsertColumn(idx, "")
 
251
 
 
252
        for x in range(idx):
 
253
            self.SetColumnWidth(x, wx.LIST_AUTOSIZE_USEHEADER)
 
254
 
 
255
        self.SetColumnWidth(1, 125)
 
256
 
 
257
 
 
258
    def LogKeyEvent(self, evType, evt):
 
259
        keycode = evt.GetKeyCode()
 
260
        keyname = keyMap.get(keycode, None)
 
261
 
 
262
        if keyname is None:
 
263
            if keycode < 256:
 
264
                if keycode == 0:
 
265
                    keyname = "NUL"
 
266
                elif keycode < 27:
 
267
                    keyname = u"Ctrl-%s" % unichr(ord('A') + keycode-1)
 
268
                else:
 
269
                    keyname = u"\"%s\"" % unichr(keycode)
 
270
            else:
 
271
                keyname = u"(%s)" % keycode
 
272
 
 
273
        UniChr = ''
 
274
        if "unicode" in wx.PlatformInfo:
 
275
            UniChr = "\"" + unichr(evt.GetUnicodeKey()) + "\""
 
276
            
 
277
        modifiers = ""
 
278
        for mod, ch in [(evt.ControlDown(),    'C'),
 
279
                        (evt.AltDown(),        'A'),
 
280
                        (evt.ShiftDown(),      'S'),
 
281
                        (evt.MetaDown(),       'M'),
 
282
                        (evt.RawControlDown(), 'R'),]:
 
283
            if mod:
 
284
                modifiers += ch
 
285
            else:
 
286
                modifiers += '-'
 
287
 
 
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()))
 
296
 
 
297
        #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
 
298
 
 
299
        self.EnsureVisible(id)
 
300
 
 
301
 
 
302
    def ClearLog(self):
 
303
        self.DeleteAllItems()
 
304
 
 
305
    def CopyLog(self):
 
306
        # build a newline and tab delimited string to put into the clipboard
 
307
        if "unicode" in wx.PlatformInfo:
 
308
            st = u""
 
309
        else:
 
310
            st = ""
 
311
        for h in self.colHeaders:
 
312
            st += h + "\t"
 
313
        st += "\n"
 
314
 
 
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"
 
319
            st += "\n"
 
320
 
 
321
        data = wx.TextDataObject()
 
322
        data.SetText(st)
 
323
        if wx.TheClipboard.Open():
 
324
            wx.TheClipboard.SetData(data)
 
325
            wx.TheClipboard.Close()
 
326
        else:
 
327
            wx.MessageBox("Unable to open the clipboard", "Error")
 
328
       
 
329
        
 
330
 
 
331
 
 
332
#----------------------------------------------------------------------
 
333
 
 
334
 
 
335
class TestPanel(wx.Panel):
 
336
    def __init__(self, parent, log):
 
337
        self.log = 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)
 
342
 
 
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")
 
347
 
 
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")
 
352
 
 
353
        cb1 = wx.CheckBox(self, -1, "Call evt.Skip in Key* events")
 
354
        self.Bind(wx.EVT_CHECKBOX, self.OnSkipCB, cb1)
 
355
        cb1.SetValue(True)
 
356
 
 
357
        cb2 = wx.CheckBox(self, -1, "KEY_UP")
 
358
        self.Bind(wx.EVT_CHECKBOX, self.OnKeyUpCB, cb2)
 
359
        cb2.SetValue(True)
 
360
 
 
361
        cb3 = wx.CheckBox(self, -1, "KEY_DOWN")
 
362
        self.Bind(wx.EVT_CHECKBOX, self.OnKeyDnCB, cb3)
 
363
        cb3.SetValue(True)
 
364
 
 
365
        cb4 = wx.CheckBox(self, -1, "CHAR")
 
366
        self.Bind(wx.EVT_CHECKBOX, self.OnCharCB, cb4)
 
367
        cb4.SetValue(True)
 
368
 
 
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)
 
376
 
 
377
        sizer = wx.BoxSizer(wx.VERTICAL)
 
378
        sizer.Add(self.keysink, 0, wx.GROW)
 
379
        sizer.Add(buttons)
 
380
        sizer.Add(self.keylog, 1, wx.GROW)
 
381
 
 
382
        self.SetSizer(sizer)
 
383
 
 
384
 
 
385
    def OnClearBtn(self, evt):
 
386
        self.keylog.ClearLog()
 
387
 
 
388
    def OnCopyBtn(self, evt):
 
389
        self.keylog.CopyLog()
 
390
 
 
391
    def OnSkipCB(self, evt):
 
392
        self.keysink.SetCallSkip(evt.GetInt())
 
393
 
 
394
    def OnKeyUpCB(self, evt):
 
395
        self.keysink.SetLogKeyUp(evt.GetInt())
 
396
 
 
397
    def OnKeyDnCB(self, evt):
 
398
        self.keysink.SetLogKeyDn(evt.GetInt())
 
399
 
 
400
    def OnCharCB(self, evt):
 
401
        self.keysink.SetLogChar(evt.GetInt())
 
402
 
 
403
 
 
404
#----------------------------------------------------------------------
 
405
 
 
406
def runTest(frame, nb, log):
 
407
    win = TestPanel(nb, log)
 
408
    return win
 
409
 
 
410
#----------------------------------------------------------------------
 
411
 
 
412
 
 
413
 
 
414
overview = """<html><body>
 
415
<h2><center>wxKeyEvents</center></h2>
 
416
 
 
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.
 
419
 
 
420
</body></html>
 
421
"""
 
422
 
 
423
 
 
424
 
 
425
if __name__ == '__main__':
 
426
    import sys,os
 
427
    import run
 
428
    run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
 
429