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:
Robin Dunn 2002-08-13 23:12:25 +00:00
parent f09359cf1b
commit 3b86714961
3 changed files with 356 additions and 6 deletions

View File

@ -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.

View File

@ -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

View 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])])