美文网首页视觉艺术
Python要玩你的键鼠——PyUserInput基础教程

Python要玩你的键鼠——PyUserInput基础教程

作者: 苏小菁在编程 | 来源:发表于2020-04-16 21:17 被阅读0次

    作为上班族每天要用键盘鼠标进行一些机械的输入和点击,会消耗掉不少的时间精力。

    游戏族每天还要刷同样的副本好几十次,真的也十分枯燥乏味。

    那么有没有什么办法可以让键盘鼠标自己动起来,解放我们聪明的大脑呢?

    有,用脚本

    虽然对于键盘鼠标脚本而言,市面上已经有非常强大的软件-按键精灵。它基本可以满足任何你对键盘鼠标操作的想法,对于简单的脚本,只需要使用录制功能就可以让脚本帮你重复机械性的操作。

    而对于更高级的按键输入需求,按键精灵基于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更多的功能(如果有的话,咕咕咕)。

    敬请期待吧!

    相关文章

      网友评论

        本文标题:Python要玩你的键鼠——PyUserInput基础教程

        本文链接:https://www.haomeiwen.com/subject/hpqjvhtx.html