Files
Phoenix/demo/UIActionSimulator.py
Robin Dunn f039f7c367 Initial port of wxPython demo from Classic to Phoenix.
Pulled and squashed from https://github.com/RobinD42/Phoenix/pull/7
Thanks Metallicow!

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@74199 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
2013-06-13 06:06:29 +00:00

151 lines
4.6 KiB
Python

import wx
import wx.lib.buttons as buttons
#----------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
self.recordingKeys = False
self.stopwatchKeys = wx.StopWatch()
self.uisim = wx.UIActionSimulator()
# create widgets and bind events
keyLabel = wx.StaticText(self, -1, "Key Events")
keyLabel.SetFont(wx.FFont(18, wx.SWISS, wx.FONTFLAG_BOLD))
self.txt = wx.TextCtrl(self, size=(300,-1))
self.txt.Bind(wx.EVT_KEY_DOWN, self.OnTxtKeyDown)
self.txt.Bind(wx.EVT_KEY_UP, self.OnTxtKeyUp)
self.recordBtn = buttons.GenToggleButton(self, -1, "Record")
self.Bind(wx.EVT_BUTTON, self.OnToggleRecordKeys, self.recordBtn)
self.recordBtn.SetToolTip(
"Click this button and then type some keys in the\n"
"textctrl. Click here again when done.")
self.playbackKeysBtn = buttons.GenButton(self, -1, "Playback")
self.Bind(wx.EVT_BUTTON, self.OnPlaybackKeys, self.playbackKeysBtn)
self.playbackKeysBtn.SetToolTip(
"Record some key events and then click here to\n"
"replay the recorded events.")
self.playbackKeysBtn.Disable()
# create the layout
gbs = wx.GridBagSizer(10,10)
gbs.Add(keyLabel, (0,0), span=(1,2))
gbs.Add(self.txt, (1,1), span=(1,2))
btnsizer = wx.BoxSizer(wx.HORIZONTAL)
btnsizer.Add(self.recordBtn)
btnsizer.Add((10,10))
btnsizer.Add(self.playbackKeysBtn)
gbs.Add(btnsizer, (2,1), span=(1,2))
self.Sizer = wx.BoxSizer()
self.Sizer.Add(gbs, 1, wx.EXPAND|wx.ALL, 20)
def OnToggleRecordKeys(self, evt):
self.recordingKeys = not self.recordingKeys
if self.recordingKeys:
self.recordBtn.SetLabel('Recording')
self.keyEvents = list()
self.stopwatchKeys.Start()
self.playbackKeysBtn.Disable()
self.txt.Clear()
self.txt.SetFocus()
else:
self.playbackKeysBtn.Enable()
self.recordBtn.SetLabel('Record')
def OnPlaybackKeys(self, evt):
self._playbackEvents = self.keyEvents[:] # make a copy so we can pop()
if self._playbackEvents:
self.playbackKeysBtn.Disable()
self.txt.Clear()
self.txt.SetFocus()
self._setNextKeyEvent()
def _playbackKey(self, evtType, key, modifiers):
if evtType == 'down':
self.uisim.KeyDown(key, modifiers)
elif evtType == 'up':
self.uisim.KeyUp(key, modifiers)
if self._playbackEvents:
self._setNextKeyEvent()
else:
self.playbackKeysBtn.Enable()
def _setNextKeyEvent(self):
evtType, key, modifiers, milli = self._playbackEvents.pop(0)
milli = max(milli/2, 1) # play back faster than it was recorded
print (evtType, key, modifiers, milli)
wx.CallLater(milli, self._playbackKey, evtType, key, modifiers)
def _onKeyEvent(self, evt, evtType):
evt.Skip()
if not self.recordingKeys:
return
evtInfo = ( evtType,
evt.KeyCode,
evt.GetModifiers(),
self.stopwatchKeys.Time(),
)
self.keyEvents.append(evtInfo)
self.stopwatchKeys.Start()
def OnTxtKeyDown(self, evt):
self._onKeyEvent(evt, 'down')
def OnTxtKeyUp(self, evt):
self._onKeyEvent(evt, 'up')
#----------------------------------------------------------------------
def runTest(frame, nb, log):
try:
uisim = wx.UIActionSimulator()
win = TestPanel(nb, log)
return win
except NotImplementedError:
from wx.lib.msgpanel import MessagePanel
win = MessagePanel(nb,
"This build of wxWidgets does not include the \n"
"wx.UIActionSimulator implementation.",
"Sorry", wx.ICON_WARNING)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>UIActionSimulator</center></h2>
wx.UIActionSimulator is a class that facilitates the injection of
mouse or keyboard events into the application's message queue.
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])