]> git.saurik.com Git - wxWidgets.git/blob - wxPython/demo/wxKeyEvents.py
7c603f17ab76b73fd105876f209c58205777f06f
[wxWidgets.git] / wxPython / demo / wxKeyEvents.py
1
2 from wxPython.wx import *
3
4 #----------------------------------------------------------------------
5
6 keyMap = {
7 WXK_BACK : "WXK_BACK",
8 WXK_TAB : "WXK_TAB",
9 WXK_RETURN : "WXK_RETURN",
10 WXK_ESCAPE : "WXK_ESCAPE",
11 WXK_SPACE : "WXK_SPACE",
12 WXK_DELETE : "WXK_DELETE",
13 WXK_START : "WXK_START",
14 WXK_LBUTTON : "WXK_LBUTTON",
15 WXK_RBUTTON : "WXK_RBUTTON",
16 WXK_CANCEL : "WXK_CANCEL",
17 WXK_MBUTTON : "WXK_MBUTTON",
18 WXK_CLEAR : "WXK_CLEAR",
19 WXK_SHIFT : "WXK_SHIFT",
20 WXK_ALT : "WXK_ALT",
21 WXK_CONTROL : "WXK_CONTROL",
22 WXK_MENU : "WXK_MENU",
23 WXK_PAUSE : "WXK_PAUSE",
24 WXK_CAPITAL : "WXK_CAPITAL",
25 WXK_PRIOR : "WXK_PRIOR",
26 WXK_NEXT : "WXK_NEXT",
27 WXK_END : "WXK_END",
28 WXK_HOME : "WXK_HOME",
29 WXK_LEFT : "WXK_LEFT",
30 WXK_UP : "WXK_UP",
31 WXK_RIGHT : "WXK_RIGHT",
32 WXK_DOWN : "WXK_DOWN",
33 WXK_SELECT : "WXK_SELECT",
34 WXK_PRINT : "WXK_PRINT",
35 WXK_EXECUTE : "WXK_EXECUTE",
36 WXK_SNAPSHOT : "WXK_SNAPSHOT",
37 WXK_INSERT : "WXK_INSERT",
38 WXK_HELP : "WXK_HELP",
39 WXK_NUMPAD0 : "WXK_NUMPAD0",
40 WXK_NUMPAD1 : "WXK_NUMPAD1",
41 WXK_NUMPAD2 : "WXK_NUMPAD2",
42 WXK_NUMPAD3 : "WXK_NUMPAD3",
43 WXK_NUMPAD4 : "WXK_NUMPAD4",
44 WXK_NUMPAD5 : "WXK_NUMPAD5",
45 WXK_NUMPAD6 : "WXK_NUMPAD6",
46 WXK_NUMPAD7 : "WXK_NUMPAD7",
47 WXK_NUMPAD8 : "WXK_NUMPAD8",
48 WXK_NUMPAD9 : "WXK_NUMPAD9",
49 WXK_MULTIPLY : "WXK_MULTIPLY",
50 WXK_ADD : "WXK_ADD",
51 WXK_SEPARATOR : "WXK_SEPARATOR",
52 WXK_SUBTRACT : "WXK_SUBTRACT",
53 WXK_DECIMAL : "WXK_DECIMAL",
54 WXK_DIVIDE : "WXK_DIVIDE",
55 WXK_F1 : "WXK_F1",
56 WXK_F2 : "WXK_F2",
57 WXK_F3 : "WXK_F3",
58 WXK_F4 : "WXK_F4",
59 WXK_F5 : "WXK_F5",
60 WXK_F6 : "WXK_F6",
61 WXK_F7 : "WXK_F7",
62 WXK_F8 : "WXK_F8",
63 WXK_F9 : "WXK_F9",
64 WXK_F10 : "WXK_F10",
65 WXK_F11 : "WXK_F11",
66 WXK_F12 : "WXK_F12",
67 WXK_F13 : "WXK_F13",
68 WXK_F14 : "WXK_F14",
69 WXK_F15 : "WXK_F15",
70 WXK_F16 : "WXK_F16",
71 WXK_F17 : "WXK_F17",
72 WXK_F18 : "WXK_F18",
73 WXK_F19 : "WXK_F19",
74 WXK_F20 : "WXK_F20",
75 WXK_F21 : "WXK_F21",
76 WXK_F22 : "WXK_F22",
77 WXK_F23 : "WXK_F23",
78 WXK_F24 : "WXK_F24",
79 WXK_NUMLOCK : "WXK_NUMLOCK",
80 WXK_SCROLL : "WXK_SCROLL",
81 WXK_PAGEUP : "WXK_PAGEUP",
82 WXK_PAGEDOWN : "WXK_PAGEDOWN",
83 WXK_NUMPAD_SPACE : "WXK_NUMPAD_SPACE",
84 WXK_NUMPAD_TAB : "WXK_NUMPAD_TAB",
85 WXK_NUMPAD_ENTER : "WXK_NUMPAD_ENTER",
86 WXK_NUMPAD_F1 : "WXK_NUMPAD_F1",
87 WXK_NUMPAD_F2 : "WXK_NUMPAD_F2",
88 WXK_NUMPAD_F3 : "WXK_NUMPAD_F3",
89 WXK_NUMPAD_F4 : "WXK_NUMPAD_F4",
90 WXK_NUMPAD_HOME : "WXK_NUMPAD_HOME",
91 WXK_NUMPAD_LEFT : "WXK_NUMPAD_LEFT",
92 WXK_NUMPAD_UP : "WXK_NUMPAD_UP",
93 WXK_NUMPAD_RIGHT : "WXK_NUMPAD_RIGHT",
94 WXK_NUMPAD_DOWN : "WXK_NUMPAD_DOWN",
95 WXK_NUMPAD_PRIOR : "WXK_NUMPAD_PRIOR",
96 WXK_NUMPAD_PAGEUP : "WXK_NUMPAD_PAGEUP",
97 WXK_NUMPAD_NEXT : "WXK_NUMPAD_NEXT",
98 WXK_NUMPAD_PAGEDOWN : "WXK_NUMPAD_PAGEDOWN",
99 WXK_NUMPAD_END : "WXK_NUMPAD_END",
100 WXK_NUMPAD_BEGIN : "WXK_NUMPAD_BEGIN",
101 WXK_NUMPAD_INSERT : "WXK_NUMPAD_INSERT",
102 WXK_NUMPAD_DELETE : "WXK_NUMPAD_DELETE",
103 WXK_NUMPAD_EQUAL : "WXK_NUMPAD_EQUAL",
104 WXK_NUMPAD_MULTIPLY : "WXK_NUMPAD_MULTIPLY",
105 WXK_NUMPAD_ADD : "WXK_NUMPAD_ADD",
106 WXK_NUMPAD_SEPARATOR : "WXK_NUMPAD_SEPARATOR",
107 WXK_NUMPAD_SUBTRACT : "WXK_NUMPAD_SUBTRACT",
108 WXK_NUMPAD_DECIMAL : "WXK_NUMPAD_DECIMAL",
109 WXK_NUMPAD_DIVIDE : "WXK_NUMPAD_DIVIDE",
110 }
111
112
113 #----------------------------------------------------------------------
114
115 class KeySink(wxWindow):
116 def __init__(self, parent):
117 wxWindow.__init__(self, parent, -1,
118 style=wxRAISED_BORDER | wxWANTS_CHARS)
119 self.SetBackgroundColour(wxBLUE)
120 self.haveFocus = false
121 self.callSkip = false
122 self.logKeyDn = true
123 self.logKeyUp = true
124 self.logChar = true
125
126 EVT_PAINT(self, self.OnPaint)
127 EVT_SET_FOCUS(self, self.OnSetFocus)
128 EVT_KILL_FOCUS(self, self.OnKillFocus)
129 EVT_MOUSE_EVENTS(self, self.OnMouse)
130
131 EVT_KEY_DOWN(self, self.OnKeyDown)
132 EVT_KEY_UP(self, self.OnKeyUp)
133 EVT_CHAR(self, self.OnChar)
134
135
136 def SetCallSkip(self, skip):
137 self.callSkip = skip
138
139 def SetLogKeyUp(self, val):
140 self.logKeyUp = val
141
142 def SetLogKeyDn(self, val):
143 self.logKeyDn = val
144
145 def SetLogChar(self, val):
146 self.logChar = val
147
148
149 def OnPaint(self, evt):
150 dc = wxPaintDC(self)
151 rect = self.GetClientRect()
152 dc.SetTextForeground(wxWHITE)
153 dc.DrawLabel("Click here and then press some keys",
154 rect, wxALIGN_CENTER | wxALIGN_TOP)
155 if self.haveFocus:
156 dc.SetTextForeground(wxGREEN)
157 dc.DrawLabel("Have Focus", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
158 else:
159 dc.SetTextForeground(wxRED)
160 dc.DrawLabel("Need Focus!", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
161
162
163 def OnSetFocus(self, evt):
164 self.haveFocus = true
165 self.Refresh()
166
167 def OnKillFocus(self, evt):
168 self.haveFocus = false
169 self.Refresh()
170
171 def OnMouse(self, evt):
172 if evt.ButtonDown():
173 self.SetFocus()
174
175
176 def OnKeyDown(self, evt):
177 if self.logKeyDn:
178 self.GetParent().keylog.LogKeyEvent("KeyDown", evt)
179 if self.callSkip:
180 evt.Skip()
181
182 def OnKeyUp(self, evt):
183 if self.logKeyUp:
184 self.GetParent().keylog.LogKeyEvent("KeyUp", evt)
185 if self.callSkip:
186 evt.Skip()
187
188 def OnChar(self, evt):
189 if self.logChar:
190 self.GetParent().keylog.LogKeyEvent("Char", evt)
191
192
193 #----------------------------------------------------------------------
194
195 from wxPython.lib.mixins.listctrl import wxListCtrlAutoWidthMixin
196
197 class KeyLog(wxListCtrl, wxListCtrlAutoWidthMixin):
198
199 def __init__(self, parent):
200 wxListCtrl.__init__(self, parent, -1,
201 style = wxLC_REPORT|wxLC_VRULES|wxLC_HRULES)
202 wxListCtrlAutoWidthMixin.__init__(self)
203
204 self.InsertColumn(0, "Event Type")
205 self.InsertColumn(1, "Key Name")
206 self.InsertColumn(2, "Key Code")
207 self.InsertColumn(3, "Modifiers")
208 self.InsertColumn(4, "RawKeyCode")
209 self.InsertColumn(5, "RawKeyFlags")
210 self.InsertColumn(6, "")
211
212 for x in range(6):
213 self.SetColumnWidth(x, wxLIST_AUTOSIZE_USEHEADER)
214
215 self.SetColumnWidth(1, 125)
216
217
218 def LogKeyEvent(self, evType, evt):
219 keycode = evt.GetKeyCode()
220 keyname = keyMap.get(keycode, None)
221 if keyname is None:
222 if keycode < 256:
223 if keycode == 0:
224 keyname = "NUL"
225 elif keycode < 27:
226 keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
227 else:
228 keyname = "\"%s\"" % chr(keycode)
229 else:
230 keyname = "unknown (%s)" % keycode
231
232 modifiers = ""
233 for mod, ch in [(evt.ControlDown(), 'C'),
234 (evt.AltDown(), 'A'),
235 (evt.ShiftDown(), 'S'),
236 (evt.MetaDown(), 'M')]:
237 if mod:
238 modifiers += ch
239 else:
240 modifiers += '-'
241
242 id = self.InsertStringItem(self.GetItemCount(), evType)
243 self.SetStringItem(id, 1, keyname)
244 self.SetStringItem(id, 2, str(keycode))
245 self.SetStringItem(id, 3, modifiers)
246 self.SetStringItem(id, 4, str(evt.GetRawKeyCode()))
247 self.SetStringItem(id, 5, str(evt.GetRawKeyFlags()))
248
249 #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
250
251 self.EnsureVisible(id)
252
253
254 def ClearLog(self):
255 self.DeleteAllItems()
256
257
258 #----------------------------------------------------------------------
259
260
261 class TestPanel(wxPanel):
262 def __init__(self, parent, log):
263 self.log = log
264 wxPanel.__init__(self, parent, -1, style=0)
265 self.keysink = KeySink(self)
266 self.keysink.SetSize((100, 65))
267 self.keylog = KeyLog(self)
268
269 btn = wxButton(self, -1, "Clear Log")
270 EVT_BUTTON(self, btn.GetId(), self.OnClearBtn)
271
272 cb1 = wxCheckBox(self, -1, "Call evt.Skip for Key Up/Dn events")
273 EVT_CHECKBOX(self, cb1.GetId(), self.OnSkipCB)
274
275 cb2 = wxCheckBox(self, -1, "EVT_KEY_UP")
276 EVT_CHECKBOX(self, cb2.GetId(), self.OnKeyUpCB)
277 cb2.SetValue(true)
278
279 cb3 = wxCheckBox(self, -1, "EVT_KEY_DOWN")
280 EVT_CHECKBOX(self, cb3.GetId(), self.OnKeyDnCB)
281 cb3.SetValue(true)
282
283 cb4 = wxCheckBox(self, -1, "EVT_CHAR")
284 EVT_CHECKBOX(self, cb4.GetId(), self.OnCharCB)
285 cb4.SetValue(true)
286
287 buttons = wxBoxSizer(wxHORIZONTAL)
288 buttons.Add(btn, 0, wxALL, 4)
289 buttons.Add(cb1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 6)
290 buttons.Add(cb2, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
291 buttons.Add(cb3, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
292 buttons.Add(cb4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
293
294 sizer = wxBoxSizer(wxVERTICAL)
295 sizer.Add(self.keysink, 0, wxGROW)
296 sizer.Add(buttons)
297 sizer.Add(self.keylog, 1, wxGROW)
298
299 self.SetSizer(sizer)
300
301
302 def OnClearBtn(self, evt):
303 self.keylog.ClearLog()
304
305 def OnSkipCB(self, evt):
306 self.keysink.SetCallSkip(evt.GetInt())
307
308 def OnKeyUpCB(self, evt):
309 self.keysink.SetLogKeyUp(evt.GetInt())
310
311 def OnKeyDnCB(self, evt):
312 self.keysink.SetLogKeyDn(evt.GetInt())
313
314 def OnCharCB(self, evt):
315 self.keysink.SetLogChar(evt.GetInt())
316
317
318 #----------------------------------------------------------------------
319
320 def runTest(frame, nb, log):
321 win = TestPanel(nb, log)
322 return win
323
324 #----------------------------------------------------------------------
325
326
327
328 overview = """<html><body>
329 <h2><center>wxKeyEvents</center></h2>
330
331 This demo simply lets catches all key events and prints info about them.
332 It is meant to be used as a compatibility test for cross platform work.
333
334 </body></html>
335 """
336
337
338
339 if __name__ == '__main__':
340 import sys,os
341 import run
342 run.main(['', os.path.basename(sys.argv[0])])
343