true/false or TRUE/FALSE to prepare for the new boolean type and constants being added to Python. Added code to wx.py to test for the existence of the new constants and to create suitable values if not present. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_4_BRANCH@19335 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			347 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			347 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
 | |
| from wxPython.wx import *
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| keyMap = {
 | |
|     WXK_BACK : "WXK_BACK",
 | |
|     WXK_TAB : "WXK_TAB",
 | |
|     WXK_RETURN : "WXK_RETURN",
 | |
|     WXK_ESCAPE : "WXK_ESCAPE",
 | |
|     WXK_SPACE : "WXK_SPACE",
 | |
|     WXK_DELETE : "WXK_DELETE",
 | |
|     WXK_START : "WXK_START",
 | |
|     WXK_LBUTTON : "WXK_LBUTTON",
 | |
|     WXK_RBUTTON : "WXK_RBUTTON",
 | |
|     WXK_CANCEL : "WXK_CANCEL",
 | |
|     WXK_MBUTTON : "WXK_MBUTTON",
 | |
|     WXK_CLEAR : "WXK_CLEAR",
 | |
|     WXK_SHIFT : "WXK_SHIFT",
 | |
|     WXK_ALT : "WXK_ALT",
 | |
|     WXK_CONTROL : "WXK_CONTROL",
 | |
|     WXK_MENU : "WXK_MENU",
 | |
|     WXK_PAUSE : "WXK_PAUSE",
 | |
|     WXK_CAPITAL : "WXK_CAPITAL",
 | |
|     WXK_PRIOR : "WXK_PRIOR",
 | |
|     WXK_NEXT : "WXK_NEXT",
 | |
|     WXK_END : "WXK_END",
 | |
|     WXK_HOME : "WXK_HOME",
 | |
|     WXK_LEFT : "WXK_LEFT",
 | |
|     WXK_UP : "WXK_UP",
 | |
|     WXK_RIGHT : "WXK_RIGHT",
 | |
|     WXK_DOWN : "WXK_DOWN",
 | |
|     WXK_SELECT : "WXK_SELECT",
 | |
|     WXK_PRINT : "WXK_PRINT",
 | |
|     WXK_EXECUTE : "WXK_EXECUTE",
 | |
|     WXK_SNAPSHOT : "WXK_SNAPSHOT",
 | |
|     WXK_INSERT : "WXK_INSERT",
 | |
|     WXK_HELP : "WXK_HELP",
 | |
|     WXK_NUMPAD0 : "WXK_NUMPAD0",
 | |
|     WXK_NUMPAD1 : "WXK_NUMPAD1",
 | |
|     WXK_NUMPAD2 : "WXK_NUMPAD2",
 | |
|     WXK_NUMPAD3 : "WXK_NUMPAD3",
 | |
|     WXK_NUMPAD4 : "WXK_NUMPAD4",
 | |
|     WXK_NUMPAD5 : "WXK_NUMPAD5",
 | |
|     WXK_NUMPAD6 : "WXK_NUMPAD6",
 | |
|     WXK_NUMPAD7 : "WXK_NUMPAD7",
 | |
|     WXK_NUMPAD8 : "WXK_NUMPAD8",
 | |
|     WXK_NUMPAD9 : "WXK_NUMPAD9",
 | |
|     WXK_MULTIPLY : "WXK_MULTIPLY",
 | |
|     WXK_ADD : "WXK_ADD",
 | |
|     WXK_SEPARATOR : "WXK_SEPARATOR",
 | |
|     WXK_SUBTRACT : "WXK_SUBTRACT",
 | |
|     WXK_DECIMAL : "WXK_DECIMAL",
 | |
|     WXK_DIVIDE : "WXK_DIVIDE",
 | |
|     WXK_F1 : "WXK_F1",
 | |
|     WXK_F2 : "WXK_F2",
 | |
|     WXK_F3 : "WXK_F3",
 | |
|     WXK_F4 : "WXK_F4",
 | |
|     WXK_F5 : "WXK_F5",
 | |
|     WXK_F6 : "WXK_F6",
 | |
|     WXK_F7 : "WXK_F7",
 | |
|     WXK_F8 : "WXK_F8",
 | |
|     WXK_F9 : "WXK_F9",
 | |
|     WXK_F10 : "WXK_F10",
 | |
|     WXK_F11 : "WXK_F11",
 | |
|     WXK_F12 : "WXK_F12",
 | |
|     WXK_F13 : "WXK_F13",
 | |
|     WXK_F14 : "WXK_F14",
 | |
|     WXK_F15 : "WXK_F15",
 | |
|     WXK_F16 : "WXK_F16",
 | |
|     WXK_F17 : "WXK_F17",
 | |
|     WXK_F18 : "WXK_F18",
 | |
|     WXK_F19 : "WXK_F19",
 | |
|     WXK_F20 : "WXK_F20",
 | |
|     WXK_F21 : "WXK_F21",
 | |
|     WXK_F22 : "WXK_F22",
 | |
|     WXK_F23 : "WXK_F23",
 | |
|     WXK_F24 : "WXK_F24",
 | |
|     WXK_NUMLOCK : "WXK_NUMLOCK",
 | |
|     WXK_SCROLL : "WXK_SCROLL",
 | |
|     WXK_PAGEUP : "WXK_PAGEUP",
 | |
|     WXK_PAGEDOWN : "WXK_PAGEDOWN",
 | |
|     WXK_NUMPAD_SPACE : "WXK_NUMPAD_SPACE",
 | |
|     WXK_NUMPAD_TAB : "WXK_NUMPAD_TAB",
 | |
|     WXK_NUMPAD_ENTER : "WXK_NUMPAD_ENTER",
 | |
|     WXK_NUMPAD_F1 : "WXK_NUMPAD_F1",
 | |
|     WXK_NUMPAD_F2 : "WXK_NUMPAD_F2",
 | |
|     WXK_NUMPAD_F3 : "WXK_NUMPAD_F3",
 | |
|     WXK_NUMPAD_F4 : "WXK_NUMPAD_F4",
 | |
|     WXK_NUMPAD_HOME : "WXK_NUMPAD_HOME",
 | |
|     WXK_NUMPAD_LEFT : "WXK_NUMPAD_LEFT",
 | |
|     WXK_NUMPAD_UP : "WXK_NUMPAD_UP",
 | |
|     WXK_NUMPAD_RIGHT : "WXK_NUMPAD_RIGHT",
 | |
|     WXK_NUMPAD_DOWN : "WXK_NUMPAD_DOWN",
 | |
|     WXK_NUMPAD_PRIOR : "WXK_NUMPAD_PRIOR",
 | |
|     WXK_NUMPAD_PAGEUP : "WXK_NUMPAD_PAGEUP",
 | |
|     WXK_NUMPAD_NEXT : "WXK_NUMPAD_NEXT",
 | |
|     WXK_NUMPAD_PAGEDOWN : "WXK_NUMPAD_PAGEDOWN",
 | |
|     WXK_NUMPAD_END : "WXK_NUMPAD_END",
 | |
|     WXK_NUMPAD_BEGIN : "WXK_NUMPAD_BEGIN",
 | |
|     WXK_NUMPAD_INSERT : "WXK_NUMPAD_INSERT",
 | |
|     WXK_NUMPAD_DELETE : "WXK_NUMPAD_DELETE",
 | |
|     WXK_NUMPAD_EQUAL : "WXK_NUMPAD_EQUAL",
 | |
|     WXK_NUMPAD_MULTIPLY : "WXK_NUMPAD_MULTIPLY",
 | |
|     WXK_NUMPAD_ADD : "WXK_NUMPAD_ADD",
 | |
|     WXK_NUMPAD_SEPARATOR : "WXK_NUMPAD_SEPARATOR",
 | |
|     WXK_NUMPAD_SUBTRACT : "WXK_NUMPAD_SUBTRACT",
 | |
|     WXK_NUMPAD_DECIMAL : "WXK_NUMPAD_DECIMAL",
 | |
|     WXK_NUMPAD_DIVIDE : "WXK_NUMPAD_DIVIDE",
 | |
| }
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| class KeySink(wxWindow):
 | |
|     def __init__(self, parent):
 | |
|         wxWindow.__init__(self, parent, -1, style =
 | |
|                           wxWANTS_CHARS
 | |
|                           #| wxRAISED_BORDER
 | |
|                           #| wxSUNKEN_BORDER
 | |
|                           )
 | |
|         self.SetBackgroundColour(wxBLUE)
 | |
|         self.haveFocus = False
 | |
|         self.callSkip = False
 | |
|         self.logKeyDn = True
 | |
|         self.logKeyUp = True
 | |
|         self.logChar = True
 | |
| 
 | |
|         EVT_PAINT(self, self.OnPaint)
 | |
|         EVT_SET_FOCUS(self, self.OnSetFocus)
 | |
|         EVT_KILL_FOCUS(self, self.OnKillFocus)
 | |
|         EVT_MOUSE_EVENTS(self, self.OnMouse)
 | |
| 
 | |
|         EVT_KEY_DOWN(self, self.OnKeyDown)
 | |
|         EVT_KEY_UP(self, self.OnKeyUp)
 | |
|         EVT_CHAR(self, self.OnChar)
 | |
| 
 | |
| 
 | |
|     def SetCallSkip(self, skip):
 | |
|         self.callSkip = skip
 | |
| 
 | |
|     def SetLogKeyUp(self, val):
 | |
|         self.logKeyUp = val
 | |
| 
 | |
|     def SetLogKeyDn(self, val):
 | |
|         self.logKeyDn = val
 | |
| 
 | |
|     def SetLogChar(self, val):
 | |
|         self.logChar = val
 | |
| 
 | |
| 
 | |
|     def OnPaint(self, evt):
 | |
|         dc = wxPaintDC(self)
 | |
|         rect = self.GetClientRect()
 | |
|         dc.SetTextForeground(wxWHITE)
 | |
|         dc.DrawLabel("Click here and then press some keys",
 | |
|                      rect, wxALIGN_CENTER | wxALIGN_TOP)
 | |
|         if self.haveFocus:
 | |
|             dc.SetTextForeground(wxGREEN)
 | |
|             dc.DrawLabel("Have Focus", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
 | |
|         else:
 | |
|             dc.SetTextForeground(wxRED)
 | |
|             dc.DrawLabel("Need Focus!", rect, wxALIGN_RIGHT | wxALIGN_BOTTOM)
 | |
| 
 | |
| 
 | |
|     def OnSetFocus(self, evt):
 | |
|         self.haveFocus = True
 | |
|         self.Refresh()
 | |
| 
 | |
|     def OnKillFocus(self, evt):
 | |
|         self.haveFocus = False
 | |
|         self.Refresh()
 | |
| 
 | |
|     def OnMouse(self, evt):
 | |
|         if evt.ButtonDown():
 | |
|             self.SetFocus()
 | |
| 
 | |
| 
 | |
|     def OnKeyDown(self, evt):
 | |
|         if self.logKeyDn:
 | |
|             self.GetParent().keylog.LogKeyEvent("KeyDown", evt)
 | |
|         if self.callSkip:
 | |
|             evt.Skip()
 | |
| 
 | |
|     def OnKeyUp(self, evt):
 | |
|         if self.logKeyUp:
 | |
|             self.GetParent().keylog.LogKeyEvent("KeyUp", evt)
 | |
|         if self.callSkip:
 | |
|             evt.Skip()
 | |
| 
 | |
|     def OnChar(self, evt):
 | |
|         if self.logChar:
 | |
|             self.GetParent().keylog.LogKeyEvent("Char", evt)
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| from wxPython.lib.mixins.listctrl import wxListCtrlAutoWidthMixin
 | |
| 
 | |
| class KeyLog(wxListCtrl, wxListCtrlAutoWidthMixin):
 | |
| 
 | |
|     def __init__(self, parent):
 | |
|         wxListCtrl.__init__(self, parent, -1,
 | |
|                             style = wxLC_REPORT|wxLC_VRULES|wxLC_HRULES)
 | |
|         wxListCtrlAutoWidthMixin.__init__(self)
 | |
| 
 | |
|         self.InsertColumn(0, "Event Type")
 | |
|         self.InsertColumn(1, "Key Name")
 | |
|         self.InsertColumn(2, "Key Code")
 | |
|         self.InsertColumn(3, "Modifiers")
 | |
|         self.InsertColumn(4, "RawKeyCode")
 | |
|         self.InsertColumn(5, "RawKeyFlags")
 | |
|         self.InsertColumn(6, "")
 | |
| 
 | |
|         for x in range(6):
 | |
|             self.SetColumnWidth(x, wxLIST_AUTOSIZE_USEHEADER)
 | |
| 
 | |
|         self.SetColumnWidth(1, 125)
 | |
| 
 | |
| 
 | |
|     def LogKeyEvent(self, evType, evt):
 | |
|         keycode = evt.GetKeyCode()
 | |
|         keyname = keyMap.get(keycode, None)
 | |
|         if keyname is None:
 | |
|             if keycode < 256:
 | |
|                 if keycode == 0:
 | |
|                     keyname = "NUL"
 | |
|                 elif keycode < 27:
 | |
|                     keyname = "Ctrl-%s" % chr(ord('A') + keycode-1)
 | |
|                 else:
 | |
|                     keyname = "\"%s\"" % chr(keycode)
 | |
|             else:
 | |
|                 keyname = "unknown (%s)" % keycode
 | |
| 
 | |
|         modifiers = ""
 | |
|         for mod, ch in [(evt.ControlDown(), 'C'),
 | |
|                         (evt.AltDown(),     'A'),
 | |
|                         (evt.ShiftDown(),   'S'),
 | |
|                         (evt.MetaDown(),    'M')]:
 | |
|             if mod:
 | |
|                 modifiers += ch
 | |
|             else:
 | |
|                 modifiers += '-'
 | |
| 
 | |
|         id = self.InsertStringItem(self.GetItemCount(), evType)
 | |
|         self.SetStringItem(id, 1, keyname)
 | |
|         self.SetStringItem(id, 2, str(keycode))
 | |
|         self.SetStringItem(id, 3, modifiers)
 | |
|         self.SetStringItem(id, 4, str(evt.GetRawKeyCode()))
 | |
|         self.SetStringItem(id, 5, str(evt.GetRawKeyFlags()))
 | |
| 
 | |
|         #print ( id, evType, keyname, str(keycode), modifiers, str(evt.GetRawKeyCode()), str(evt.GetRawKeyFlags()))
 | |
| 
 | |
|         self.EnsureVisible(id)
 | |
| 
 | |
| 
 | |
|     def ClearLog(self):
 | |
|         self.DeleteAllItems()
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| class TestPanel(wxPanel):
 | |
|     def __init__(self, parent, log):
 | |
|         self.log = log
 | |
|         wxPanel.__init__(self, parent, -1, style=0)
 | |
|         self.keysink = KeySink(self)
 | |
|         self.keysink.SetSize((100, 65))
 | |
|         self.keylog = KeyLog(self)
 | |
| 
 | |
|         btn = wxButton(self, -1, "Clear Log")
 | |
|         EVT_BUTTON(self, btn.GetId(), self.OnClearBtn)
 | |
| 
 | |
|         cb1 = wxCheckBox(self, -1, "Call evt.Skip for Key Up/Dn events")
 | |
|         EVT_CHECKBOX(self, cb1.GetId(), self.OnSkipCB)
 | |
| 
 | |
|         cb2 = wxCheckBox(self, -1, "EVT_KEY_UP")
 | |
|         EVT_CHECKBOX(self, cb2.GetId(), self.OnKeyUpCB)
 | |
|         cb2.SetValue(True)
 | |
| 
 | |
|         cb3 = wxCheckBox(self, -1, "EVT_KEY_DOWN")
 | |
|         EVT_CHECKBOX(self, cb3.GetId(), self.OnKeyDnCB)
 | |
|         cb3.SetValue(True)
 | |
| 
 | |
|         cb4 = wxCheckBox(self, -1, "EVT_CHAR")
 | |
|         EVT_CHECKBOX(self, cb4.GetId(), self.OnCharCB)
 | |
|         cb4.SetValue(True)
 | |
| 
 | |
|         buttons = wxBoxSizer(wxHORIZONTAL)
 | |
|         buttons.Add(btn, 0, wxALL, 4)
 | |
|         buttons.Add(cb1, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 6)
 | |
|         buttons.Add(cb2, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
 | |
|         buttons.Add(cb3, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
 | |
|         buttons.Add(cb4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 6)
 | |
| 
 | |
|         sizer = wxBoxSizer(wxVERTICAL)
 | |
|         sizer.Add(self.keysink, 0, wxGROW)
 | |
|         sizer.Add(buttons)
 | |
|         sizer.Add(self.keylog, 1, wxGROW)
 | |
| 
 | |
|         self.SetSizer(sizer)
 | |
| 
 | |
| 
 | |
|     def OnClearBtn(self, evt):
 | |
|         self.keylog.ClearLog()
 | |
| 
 | |
|     def OnSkipCB(self, evt):
 | |
|         self.keysink.SetCallSkip(evt.GetInt())
 | |
| 
 | |
|     def OnKeyUpCB(self, evt):
 | |
|         self.keysink.SetLogKeyUp(evt.GetInt())
 | |
| 
 | |
|     def OnKeyDnCB(self, evt):
 | |
|         self.keysink.SetLogKeyDn(evt.GetInt())
 | |
| 
 | |
|     def OnCharCB(self, evt):
 | |
|         self.keysink.SetLogChar(evt.GetInt())
 | |
| 
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| def runTest(frame, nb, log):
 | |
|     win = TestPanel(nb, log)
 | |
|     return win
 | |
| 
 | |
| #----------------------------------------------------------------------
 | |
| 
 | |
| 
 | |
| 
 | |
| overview = """<html><body>
 | |
| <h2><center>wxKeyEvents</center></h2>
 | |
| 
 | |
| This demo simply lets catches all key events and prints info about them.
 | |
| It is meant to be used as a compatibility test for cross platform work.
 | |
| 
 | |
| </body></html>
 | |
| """
 | |
| 
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     import sys,os
 | |
|     import run
 | |
|     run.main(['', os.path.basename(sys.argv[0])])
 | |
| 
 |