]>
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
):
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
)
218 self
.InsertColumn(idx
, "")
221 self
.SetColumnWidth(x
, wx
.LIST_AUTOSIZE_USEHEADER
)
223 self
.SetColumnWidth(1, 125)
226 def LogKeyEvent(self
, evType
, evt
):
227 keycode
= evt
.GetKeyCode()
228 keyname
= keyMap
.get(keycode
, None)
234 keyname
= "Ctrl-%s" % chr(ord('A') + keycode
-1)
236 keyname
= "\"%s\"" % chr(keycode
)
237 elif "unicode" in wx
.PlatformInfo
:
238 keyname
= "\"" + unichr(keycode
) + "\""
240 keyname
= "unknown (%s)" % keycode
243 for mod
, ch
in [(evt
.ControlDown(), 'C'),
244 (evt
.AltDown(), 'A'),
245 (evt
.ShiftDown(), 'S'),
246 (evt
.MetaDown(), 'M')]:
252 id = self
.InsertStringItem(self
.GetItemCount(), evType
)
253 self
.SetStringItem(id, 1, keyname
)
254 self
.SetStringItem(id, 2, str(keycode
))
255 self
.SetStringItem(id, 3, modifiers
)
256 self
.SetStringItem(id, 4, str(evt
.GetUnicodeKey()))
257 self
.SetStringItem(id, 5, str(evt
.GetRawKeyCode()))
258 self
.SetStringItem(id, 6, str(evt
.GetRawKeyFlags()))
260 #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
262 self
.EnsureVisible(id)
266 self
.DeleteAllItems()
269 # build a newline and tab delimited string to put into the clipboard
270 if "unicode" in wx
.PlatformInfo
:
274 for h
in self
.colHeaders
:
278 for idx
in range(self
.GetItemCount()):
279 for col
in range(self
.GetColumnCount()):
280 item
= self
.GetItem(idx
, col
)
281 st
+= item
.GetText() + "\t"
284 data
= wx
.TextDataObject()
286 if wx
.TheClipboard
.Open():
287 wx
.TheClipboard
.SetData(data
)
288 wx
.TheClipboard
.Close()
290 wx
.MessageBox("Unable to open the clipboard", "Error")
295 #----------------------------------------------------------------------
298 class TestPanel(wx
.Panel
):
299 def __init__(self
, parent
, log
):
301 wx
.Panel
.__init
__(self
, parent
, -1, style
=0)
302 self
.keysink
= KeySink(self
)
303 self
.keysink
.SetMinSize((100, 65))
304 self
.keylog
= KeyLog(self
)
306 btn
= wx
.Button(self
, -1, "Clear", style
=wx
.BU_EXACTFIT
)
307 self
.Bind(wx
.EVT_BUTTON
, self
.OnClearBtn
, btn
)
309 btn2
= wx
.Button(self
, -1, "Copy", style
=wx
.BU_EXACTFIT
)
310 self
.Bind(wx
.EVT_BUTTON
, self
.OnCopyBtn
, btn2
)
312 cb1
= wx
.CheckBox(self
, -1, "Call evt.Skip in Key* events")
313 self
.Bind(wx
.EVT_CHECKBOX
, self
.OnSkipCB
, cb1
)
315 cb2
= wx
.CheckBox(self
, -1, "KEY_UP")
316 self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyUpCB
, cb2
)
319 cb3
= wx
.CheckBox(self
, -1, "KEY_DOWN")
320 self
.Bind(wx
.EVT_CHECKBOX
, self
.OnKeyDnCB
, cb3
)
323 cb4
= wx
.CheckBox(self
, -1, "CHAR")
324 self
.Bind(wx
.EVT_CHECKBOX
, self
.OnCharCB
, cb4
)
327 buttons
= wx
.BoxSizer(wx
.HORIZONTAL
)
328 buttons
.Add(btn
, 0, wx
.ALL
, 4)
329 buttons
.Add(btn2
, 0, wx
.ALL
, 4)
330 buttons
.Add(cb1
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT|wx
.RIGHT
, 6)
331 buttons
.Add(cb2
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6)
332 buttons
.Add(cb3
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6)
333 buttons
.Add(cb4
, 0, wx
.ALIGN_CENTER_VERTICAL|wx
.LEFT
, 6)
335 sizer
= wx
.BoxSizer(wx
.VERTICAL
)
336 sizer
.Add(self
.keysink
, 0, wx
.GROW
)
338 sizer
.Add(self
.keylog
, 1, wx
.GROW
)
343 def OnClearBtn(self
, evt
):
344 self
.keylog
.ClearLog()
346 def OnCopyBtn(self
, evt
):
347 self
.keylog
.CopyLog()
349 def OnSkipCB(self
, evt
):
350 self
.keysink
.SetCallSkip(evt
.GetInt())
352 def OnKeyUpCB(self
, evt
):
353 self
.keysink
.SetLogKeyUp(evt
.GetInt())
355 def OnKeyDnCB(self
, evt
):
356 self
.keysink
.SetLogKeyDn(evt
.GetInt())
358 def OnCharCB(self
, evt
):
359 self
.keysink
.SetLogChar(evt
.GetInt())
362 #----------------------------------------------------------------------
364 def runTest(frame
, nb
, log
):
365 win
= TestPanel(nb
, log
)
368 #----------------------------------------------------------------------
372 overview
= """<html><body>
373 <h2><center>wxKeyEvents</center></h2>
375 This demo simply catches all key events and prints info about them.
376 It is meant to be used as a compatibility test for cross platform work.
383 if __name__
== '__main__':
386 run
.main(['', os
.path
.basename(sys
.argv
[0])] + sys
.argv
[1:])