18.9 控制键盘
pyautogui 也有一些函数向计算机发送虚拟按键,让你能够填充表格,或在应用中输入文本。
18.9.1 通过键盘发送一个字符串
pyautogui.typewrite() 函数向计算机发送虚拟按键。这些按键产生什么效果,取决于当前获得焦点的窗口和文本输入框。可能需要先向文本输入框发送一次鼠标点击,确保它获得焦点。
举一个简单的例子,让我们用 Python 自动化在文件编辑窗口中输入 Hello world!。首先, 打开一个新的文件编辑窗口, 将它放在屏幕的左上角, 以便 pyautogui
点击正确的位置,让它获得焦点。然后,在交互式环境中输入以下内容:
>>> pyautogui.click(100, 100); pyautogui.typewrite('Hello world!')
请注意,在同一行中放两条命令,用分号隔开,这让交互式环境不会在两个指令之间提示输入。这防止了你在 click() 和 typewrite() 调用之间,不小心让新的窗口获得焦点,从而让这个例子失败。
Python 首先在坐标(100,100)处发出虚拟鼠标点击,这将点击文件编辑窗口,让它获得焦点。typewrite() 函数调用将向窗口发送文本 Hello world!,结果就像图
18-3。现在有了替你打字的代码!
默认情况下,typewrite() 函数将立即打印出完整字符串。但是,你可以传入可选的
第二参数,在每个字符之间添加短时间暂停。例如,pyautogui.typewrite('Helloworld!', 0.25)将在打出H 后等待1/4 秒。打出e 以后再等待 1/4
秒,如此等等。这种渐进的打字机效果,对于较慢的应用可能有用,它们处理击键的速度不够快,跟不上pyautogui。
对于A 或!这样的字符,pyautogui 将自动模拟按住Shift 键。
18.9.2 键名
不是所有的键都很容易用单个文本字符来表示。例如,如何把Shift 键或左箭头
键表示为单个字符?在 PyAutoGUI 中,这些键表示为短的字符串值:'esc' 表示 Esc 键,
'enter' 表示 Enter。
除了单个字符串参数,还可以向 typewrite() 函数传递这些键字符串的列表。例如,以下的调用表示按 a 键,然后是 b 键,然后是左箭头两次,最后是X 和Y 键:
>>> pyautogui.typewrite(['a', 'b', 'left', 'left', 'X', 'Y'])
因为按下左箭头将移动键盘光标,所以这会输出 XYab。表 18-1 列出了 pyautogui
的键盘键字符串,你可以将它们传递给 typewrite() 函数,模拟任何按键组合。
也可以查看 pyautogui.KEYBOARD_KEYS 列表,看看 pyautogui 接受的所有可能的键字符串。'shift' 字符串指的是左边的 Shift 键,它等价于
'shiftleft'。'ctrl'、 'alt' 和 'win' 字符串也一样,它们都是指左边的键。
表 18-1 PyKeyboard 属性
键盘键字符串 含义
'a', 'b', 'c', 'A', 'B', 'C', '1', '2', '3',
'!', '@', '#',等等
单个字符的键
'enter'(or 'return' or '\n') 回车键
'esc' Esc 键
'shiftleft', 'shiftright' 左右 Shift 键
'altleft', 'altright' 左右 Alt 键
'ctrlleft', 'ctrlright' 左右Ctrl 键
'tab'(or '\t') Tab 键
'backspace', 'delete' Backspace 和 Delete 键
'pageup', 'pagedown' Page Up 和 Page Down 键
'home', 'end' Home 和 End 键
'up', 'down', 'left', 'right' 上下左右箭头键
'f1', 'f2', 'f3',等等 F1 至 F12 键
'volumemute', 'volumedown', 'volumeup' 静音、减小音量、放大音量键(有些键盘没有这些键,但你
的操作系统仍能理解这些模拟的按键)
'pause' Pause 键
18.9.3 按下和释放键盘
就像 mouseDown() 和 mouseUp() 函数一样,pyautogui.keyDown() 和 pyautogui. keyUp()
将向计算发送虚拟的按键和释放。它们将根据参数发送键字符串(参见表 18-1)。方便起见,pyautogui 提供了pyautogui.press() 函数,它调用这两个函数,模拟完整的击键。
运行下面的代码,它将打印出美元字符(通过按住Shift 键并按 4 得到):
>>> pyautogui.keyDown('shift'); pyautogui.press('4'); pyautogui.keyUp('shift')
这行代码按下 Shift,按下(并释放)4,然后再释放 Shift。如果你需要在文本输入框内打一个字符串,typewrite() 函数就更适合。但对于接受单个按键命令的应用,press()
函数是更简单的方式。
18.9.4 热键组合
“热键”或“快捷键”是一种按键组合,它调用某种应用功能。拷贝选择内容的常用热键是 Ctrl-C(在 Windows 和 Linux 上)或 -C(在 OS X 上)。用户按住 Ctrl
键,然后按C 键,然后释放C 和Ctrl 键。要用pyautogui 的keyDown() 和keyUp() 函数来做到这一点,必须输入以下代码:
pyautogui.keyDown('ctrl') pyautogui.keyDown('c') pyautogui.keyUp('c') pyautogui.keyUp('ctrl')
这相当复杂。作为替代,可以使用 pyautogui.hotkey() 函数,它接受多个键字符串参数,按顺序按下,再按相反的顺序释放。例如对于 Ctrl-C,代码就像下面这样简单:
pyautogui.hotkey('ctrl', 'c')
对于更大的热键组合,这个函数特别有用。在 Word 中,Ctrl-Alt-Shift-S 热键组合显示 Style(样式)窗口。不必使用 8 次不同的函数调用(4 次 keyDown() 调用和 4
次 keyUp() 调用),你只要调用 hotkey('ctrl', 'alt', 'shift', 's')。
在屏幕的左上角打开一个新的 IDLE 文件编辑窗口,在交互式环境中输入以下
内容(在OS X 中,用 'ctrl' 代替 'alt'):
>>> import pyautogui, time
>>> def commentAfterDelay():
➊ pyautogui.click(100, 100)
➋ pyautogui.typewrite('In IDLE, Alt-3 comments out a line.')
time.sleep(2)
➌ pyautogui.hotkey('alt', '3')
>>> commentAfterDelay()
这定义了一个函数 commentAfterDelay(),在被调用时,将点击文件编辑窗口,让它获得焦点➊,输出“In IDLE,Alt-3 comments out a
line”➋,暂停2秒钟,然后模拟按下 Alt-3 热键(或 OS X 上的 ctrl-3)➌。这个快捷键在当前行加上两个#字符,将它注释掉(在
IDLE 中编写你自己的代码时,这是一个有用的技巧,应该知道)。