Python触发按键事件
2015-03-02缘起
最近想尝试做一个简单的命令控制系统,关于命令控制方面的技术暂且不说,这个我也还在调研、学习,估计进度会很慢——我将问题分解后,发现有一些无关语音技术的小问题是可以优先去解决的,比如音频的录制,还有就是本篇所说的按键触发。
按键的捕获这个是很容易做的事情,很容易想到 Python 众多的 GUI 库必然都会包含这一功能,但按键触发的 Python 库找了一圈也没找到几个。最后还是在 StackOverflow 上找到了可靠的答案。也就是说,本文也不过是一些已有信息的组织和加工而已——事实上我写的大部分博客都属于此列吧。
按键触发最终必然涉及到底层系统调用,对于这些底层的东西,我不太关心,我只是想达到效果而已。所以我也是对我觉得好用的库进行实践说明了。鉴于我的开发环境是 Linux,我只会对适用于 Linux 的或者跨平台的库进行说明。
适用于Linux的方法
在 Linux 的 X 环境(即桌面环境)上,可以通过 xautomation 软件包中的 xte 工具来触发按键、鼠标点击等事件,在 Linux 系统上通过软件包管理系统直接安装即可。其效果如下图所示:
在 Linux 上的办法就是在 Python 中通过子进程来调用 xte ,以达到效果。下面是一个简短的示例代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- from subprocess import Popen, PIPE emacs_save_sequence = '''keydown Control_L key x key s keyup Control_L ''' def keypress(sequence): p = Popen(['xte'], stdin=PIPE) p.communicate(input=sequence) keypress(emacs_save_sequence)
上述代码触发的是 Emacs 的保存快捷键"C-x C-s"。
适用于Windows的方法
在Windows系统上可以通过 pyHook 来进行按键触发,限于环境,就不作展开了。
跨平台的方法
PyUserInput 这个 Python 库能够在 Linux 、Mac 和 Windows 三个系统上使用,考虑跨平台的工具的话可以使用它。
它的使用也很简单,对于按键事件来说,是通过一个 PyKeyboard 对象来进行的,通过三种不同的方法来触发不同的事件
- press_key: 按下
- release_key: 松开
- tap_key: 敲击
当然,它还提供了如 type_string 这样的方法来进行字符串的输入。
下面是用 PyUserInput 写的触发 Emacs 的保存快捷键 "C-x C-s"的示例代码:
#!/usr/bin/env python # -*- coding: utf-8 -*- from pykeyboard import PyKeyboard k = PyKeyboard() k.press_key(k.control_l_key) k.tap_key('x') k.tap_key('s') k.release_key(k.control_l_key)