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
This commit is contained in:
parent
f09359cf1b
commit
3b86714961
@ -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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
343
wxPython/demo/wxKeyEvents.py
Normal file
343
wxPython/demo/wxKeyEvents.py
Normal file
@ -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 = """<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])])
|
||||
|
Loading…
Reference in New Issue
Block a user