Python要玩你的键鼠——PyUserInput基础教程
作为上班族每天要用键盘鼠标进行一些机械的输入和点击,会消耗掉不少的时间精力。
游戏族每天还要刷同样的副本好几十次,真的也十分枯燥乏味。
那么有没有什么办法可以让键盘鼠标自己动起来,解放我们聪明的大脑呢?
有,用脚本
虽然对于键盘鼠标脚本而言,市面上已经有非常强大的软件-按键精灵。它基本可以满足任何你对键盘鼠标操作的想法,对于简单的脚本,只需要使用录制功能就可以让脚本帮你重复机械性的操作。
而对于更高级的按键输入需求,按键精灵基于VBscript研发了Q语言,去掉了VBscript的一些功能,用于开发其按键脚本。所以懂得使用VBscript的朋友也可以直接在里面编辑脚本。
不过虽然按键精灵功能十分强大且易用,但是VBscript的受众面相对较小(也有可能是因为我不懂才这么觉得),Q语言学习的复用性又不强。另外按键精灵官方的教程并不十分齐全,有些高级教程竟然需要会员才可以解锁查看。这十分不符合知识共享精神。
那么,既然我们会点Python,那当然是要用Python来搞点事情。
不过,这个事情早就有人搞过了。Paul Barton等人基于Pepijn de Vos的PyMouse包整合优化形成了PyUserInput包,用于在各大操作系统中监视键盘鼠标事件。源代码地址如下:
https://github.com/PyUserInput/PyUserInput
PyUserInput是一个面向python用于跨平台控制鼠标和键盘的模块,使用简单。在Windows、Mac和X11(大多数Linux)系统上,鼠标控制应该都能正确运行。鼠标的滚动也是可以实现的,不过鼠标滚动本身在各操作系统和各应用程序之间就存在差异,用户在使用之时需要注意。键盘控制在X11(Linux)和Windows系统上都没有问题,而Mac系统上的键盘输入还待优化。
那么,让我们用PyUserInput这个小工具包,解放我们的双手。
LET'S GOOOOOOOOOOO !
安装
依赖包
根据你使用的操作系统,需要为PyUserInput安装依赖包:
- Linux:Xlib (python-xlib)
- Mac:Quartz, AppKit
- Windows:pywin32, pyHook
如果未成功安装上述依赖包,那么在安装PyUserInput时就会报错。
Windows 依赖包
这里我们着重介绍一下,Window系统下的依赖包。Windows上的PyUserInput依赖于pywin32。pywin32是用于Windows系统的Python拓展包,它包含了几乎所有的Windows API,可以很方便地从Python直接调用,还可以创建并使用COM对象。你可以访问下面的网址进行下载安装:
http://sourceforge.net/projects/pywin32/files/pywin32/
这里需要自行选择与已有的Python版本相对应的文件进行下载。
使用pip
PyUserInput在PyPI上(Python Package Index,Python库索引)注册并更新,所以用pip安装会很方便,只需要在终端入以下代码:
pip install PyUserInput
使用源代码
你可以从下面github里下载zip文件,也可以从PyPI里下载包含源码的tar.gz文件。
https://github.com/PyUserInput/PyUserInput/archive/master.zip
将文件解压缩到目录后,打开终端,指向刚刚解压的包含setup.py的目录。然后输入以下命令:
python setup.py install
如果是Linux系统中,可能存在权限问题,那么就需要在命令前加上sudo
。经过亲身体验,由于网络等问题,使用pip安装可能会失败,这里推荐使用源代码安装,并且手动安装依赖包。
新手上路
在成功安装了PyUserInput之后,你的Python路径中应该会包含pymouse和pykeyboard两个模块了。想让Python帮你使用鼠标键盘,就要先创建鼠标和键盘对象:
from pymouse import PyMouse
from pykeyboard import PyKeyboard
m = PyMouse()
k = PyKeyboard()
上面的PyMouse()
类和PyKeyboard()
类,就是鼠标和键盘的对象。之后所有的操作,基本都包含在这两个类的方法中。接下来让我们尝试点击一下屏幕中央,并用键盘输入:"Hello, World!"
x_dim, y_dim = m.screen_size()
m.click(x_dim/2, y_dim/2, 1, 1)
k.type_string('Hello, World!')
鼠标对象拥有screen_size()
方法,用于返回当前使用屏幕的尺寸。鼠标和键盘对象的click()
方法和type_string()
方法,顾名思义,就是使用鼠标点击,用键盘输入。click()
方法需要传递4个参数,前两个参数分别是希望鼠标点击的X坐标和Y坐标;第三个参数为需要点击的鼠标按键,1为左键,2为右键,3为中键;第四个参数为点击次数。
此外PyKeyboard还提供了一系列输入按键的方式:
# pressing a key
k.press_key('H')
# which you then follow with a release of the key
k.release_key('H')
# or you can 'tap' a key which does both
k.tap_key('e')
# note that that tap_key does support a way of repeating keystrokes with a interval time between each
k.tap_key('l',n=2,interval=5)
# and you can send a string if needed too
k.type_string('o World!')
上面显示的方法其实十分容易理解,press_key()
和release_key()
即为按下,松开按键,tap_key()
为点击按键,这个方法有三个参数可供传递,第一个参数为需要点击的键位,可以用字符的形式输入;第二个参数为点击的次数,默认为1;第三个参数为点击间隔的时间,单位为秒,默认为0。但是,键盘上还有一些特殊的按键(比如shift,ctrl,enter等),无法用字符的形式输入怎么办?不用担心,PyKeyboard也提供了一系列特殊按键的输入方式:
#Create an Alt+Tab combo
k.press_key(k.alt_key)
k.tap_key(k.tab_key)
k.release_key(k.alt_key)
k.tap_key(k.function_keys[5]) # Tap F5
k.tap_key(k.numpad_keys['Home']) # Tap 'Home' on the numpad
k.tap_key(k.numpad_keys[5], n=3) # Tap 5 on the numpad, thrice
上面的代码就展示了,对alt键,tab键,F5键,Home键,小键盘的操作方法。PyKeyboard把这些特殊的按键定义成了类属性了,在调用时输入属性即可。然而这种表示方法可能有些难记,并且键盘上的特殊按键很多,一一展示显得过于冗长。大家可以打开从GitHub中下载的源码,打开pykeyboard文件夹,找到当前操作系统适用的.py
文件,就可以看到里面的special_key_assignment,这里定义了所有特殊按键的属性,大家可以根据这个表找到自己想要输入的键位。
如果大家有兴趣打开所有的.py
文件看看里面内容的话,大概会发现,每个操作系统的特殊按键都十分不同。因为对于键盘鼠标的输入,在各个操作平台间保持一致性是一个很大的挑战。比如像这样:
# Windows
k.tap_key(k.alt_key)
# Mac
k.tap_key('Alternate')
Mac和Windows中,alt键的输入方法就不一样。所以大家最好打开源代码学习一下,以方便记忆和理解。
使用按键输入还有一个情况,虽然普通按键可以使用type_string()
进行连续输入,那么特殊按键无法使用字符,该如何进行连续输入呢?这里需要使用press_keys()
方法来输入多个按键(一般在使用键盘快捷键时常出现这样的情况):
# Mac example
k.press_keys(['Command','shift','3'])
# Windows example
k.press_keys([k.windows_l_key,'d'])
上面的例子,分别在Mac和Windows中,输入了command+shift+3
和win+d
。
上面的内容已经基本囊括了键盘和鼠标的基本输入方式,我们已经可以用这些方法编写满足很多功能的程序了。但是这些程序有一个问题,就是当我们编写完并开始运行之后,程序就按照我们编写的内容执行了,我们无法在程序中进行交互。或者说,有时我们需要一个开关,在点下某个按键之后,执行某一部分功能。让我们来看看高级玩法。
高级玩法
如果我们的程序需要实现交互或者开关功能,就要特别介绍一下pymouse和pykeyboard中两个特殊的类:PyMouseEvent和PyKeyboardEvent。这两个对象是监控鼠标和键盘输入的框架,你必须将其子类化,然后它们就可以通过监控鼠标键盘输入,来实现一些其他的功能。这里有一个PyMouseEvent子类化的例子:
from pymouse import PyMouseEvent
def fibo():
a = 0
yield a
b = 1
yield b
while True:
a, b = b, a+b
yield b
class Clickonacci(PyMouseEvent):
def __init__(self):
PyMouseEvent.__init__(self)
self.fibo = fibo()
def click(self, x, y, button, press):
'''Print Fibonacci numbers when the left click is pressed.'''
if button == 1:
if press:
print(self.fibo.next())
else: # Exit if any other mouse button used
self.stop()
C = Clickonacci()
C.run()
上面的代码我们定义了一个PyMouseEvent类的子类:Clickonacci类。并且,我们对Clickonacci类定义了一个fibo
属性,并且在Clickonacci类的click()
方法中调用它。这个click()
方法的功能就是,每当按下鼠标左键时,打印一个斐波那契数列中的数,当按下一个任意别的键时,程序停止。这样我们成功就给程序设置了一个开关。
上面所有的示例代码,基本可以囊括我们日常需要的程序需求了。我们的基础教程也先展示到这里,当然PyUserInput的特性还不止如此,有兴趣的朋友可以打开源代码学习。希望在未来的文章中能用一个小项目来展示PyUserInput更多的功能(如果有的话,咕咕咕)。
敬请期待吧!