From: Robin Dunn Date: Tue, 13 Aug 2002 23:12:25 +0000 (+0000) Subject: Added a sample to the demo that catches various key events and X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/3b867149612d2146d5a781874f0e5ccf1b0dc43b Added a sample to the demo that catches various key events and displays the details of the event. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@16496 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/wxPython/CHANGES.txt b/wxPython/CHANGES.txt index bb5c94c72a..11db24b6ce 100644 --- a/wxPython/CHANGES.txt +++ b/wxPython/CHANGES.txt @@ -93,8 +93,8 @@ the image data. (Patch #546009) Added a sample that shows how to embed wxPython in a wxWindows C++ application. -Added wxPyWindow and wxPyControl which are just like their wx -counterparts except they allow some of the more common C++ virtual +Added wxPyWindow, wxPyPanel and wxPyControl which are just like their +wx counterparts except they allow some of the more common C++ virtual methods to be overridden in Python derived classes. The methods supported are: @@ -114,9 +114,11 @@ supported are: AcceptsFocus AcceptsFocusFromKeyboard GetMaxSize + AddChild + RemoveChild - If there are other methods that should be supported please let me - know. + If there are other methods that you think should be supported + please let me know. Changed wxGenButton to derive from wxPyControl and overload DoGetBestSize and AcceptsFocus. @@ -159,6 +161,9 @@ Moved tools to be a Python package in wxPython.tools, added scripts to import and launch each tool. This will let you import and use the tools in your own scripts or apps as needed. +Added a sample to the demo that catches various key events and +displays the details of the event. + diff --git a/wxPython/demo/Main.py b/wxPython/demo/Main.py index d7fc3a4fd3..b06f4da5c9 100644 --- a/wxPython/demo/Main.py +++ b/wxPython/demo/Main.py @@ -34,6 +34,7 @@ _treeList = [ 'ScrolledPanel', 'wxMenu', 'wxIEHtmlWin', + 'wxKeyEvents', ]), # managed windows == things with a caption you can close @@ -116,12 +117,12 @@ _treeList = [ 'wxDynamicSashWindow', 'wxEditableListBox', 'wxEditor', - 'wxFloatBar', + #'wxFloatBar', deprecated 'wxHtmlWindow', 'wxIEHtmlWin', 'wxLEDNumberCtrl', 'wxMimeTypesManager', - 'wxMVCTree', + #'wxMVCTree', deprecated 'wxRightTextCtrl', 'wxStyledTextCtrl_1', 'wxStyledTextCtrl_2', @@ -146,6 +147,7 @@ _treeList = [ 'Threads', 'wxProcess', 'wxTimer', + 'wxKeyEvents', ]), # Clipboard and DnD diff --git a/wxPython/demo/wxKeyEvents.py b/wxPython/demo/wxKeyEvents.py new file mode 100644 index 0000000000..4811892fe8 --- /dev/null +++ b/wxPython/demo/wxKeyEvents.py @@ -0,0 +1,343 @@ + +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=wxRAISED_BORDER | wxWANTS_CHARS) + 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(0xffffff, 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 = """ +

wxKeyEvents

+ +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. + + +""" + + + +if __name__ == '__main__': + import sys,os + import run + run.main(['', os.path.basename(sys.argv[0])]) +