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+3win+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更多的功能(如果有的话,咕咕咕)。

敬请期待吧!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容