File: UIActionSimulator.py

package info (click to toggle)
wxpython3.0 3.0.2.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 482,760 kB
  • ctags: 518,293
  • sloc: cpp: 2,127,226; python: 294,045; makefile: 51,942; ansic: 19,033; sh: 3,013; xml: 1,629; perl: 17
file content (150 lines) | stat: -rw-r--r-- 4,739 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150

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.SetToolTipString(
            "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.SetToolTipString(
            "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.Modifiers,
                    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:])