Python学习笔记——用GUI自动化控制键盘和鼠标

安装pyautogui模块

pyautogui模块可以向Windows、OSX和Linux发送虚拟按键和鼠标点击。

安装依赖

  • 在Windows上,不需要安装其他模块。
  • 在OSX上,运行
sudo pip3 install pyobjc-framework-Quartz
sudo pip3 install pyobjc-core
sudo pip3 install pyobjc
  • 在Linux上,运行
sudo pip3 install python3-xlib
sudo apt-get install scrot
sudo apt-get install python3-tk
sudo apt-get install python3-dev
#(Scrot是PyAutoGUI使用的屏幕快照程序)。

在这些依赖安装后,运行pip install pyautogui(或在OSX和Linux上运行pip3),安装pyautogui。

1. 异常情况处理

Python能以想象不到的速度移动并点击,它可能由于速度太快导致其他应用程序跟不上。以下有几种方法来防止和恢复自动化问题。

1.1 注销关闭所有程序来恢复系统。

1.2 暂停和自动防故障装置

  • 设置pyautogui.PAUSE = 1.5之后每个PythonGUI函数调用在执行动作之后,都会暂停1.5s,非PyAtuGUI指令不会暂停
  • 将鼠标移动到左上角将产生pyautogui.FailSafeException异常,可以设置pyautogui.FAILSAFE=False,禁用自动防故障功能。

2 控制鼠标

获取屏幕宽高:

#屏幕分辨率的不同,返回值可能不一样.
width, height = pyautogui.size() 

2.1 鼠标移动

  • moveto

    # 移动到x, y 坐标处,用时0.25s
    pyautogui.moveto(x, y, duration=0.25)
    
  • moveRel

    # 相对于当前位置移动鼠标,x、y可以为负数
    pyautogui.moveRel(x, y, duration=0.25)
    
  • 获取鼠标当前的位置
    调用pyautogui.position(),可以获得鼠标当前的位置。它将返回函数调用时,鼠标x、y坐标的元组。

2.2 点击鼠标

  • 鼠标点击,就调用 pyautogui.click()方法。默认 情况下,点击将使用鼠标左键,点击发生在鼠标当前所在位置。
  • 可以传入x、y坐标作为可选的第一第二参数, 点击做标为x, y处。
  • 如果想指定鼠标按键,就加入button关键字参数,值分别为'left'、'middle'或'right'。例如,pyautogui.click(100, 150, button='left')
  • 实现点击也可以调用pyautogui.mouseDown(),这只是按下鼠标按键,再调用pyautogui.mouseUp(),这只是释放鼠标按键。这些函数的参数与click()相同。实际上,click()函数只是这两个函数调用的方便封装。
  • 为了进一步方便,pyautogui.doubleClick()函数只 执行 双击鼠标左键。pyautogui.rightClick()和pyautogui.middleClick()函数将分别执行双击右键和双击中键。

2.3 拖动鼠标

PyAutoGUI提供了pyautogui.dragTo()和pyautogui.dragRel()函数,将鼠标拖动到一个新的位置,或相对当前位置的位置。

# 拖动到x, y 坐标处,用时0.25s
pyautogui.dragTo(x, y, duration=0.25)
# 相对于当前位置拖动鼠标,x、y可以为负数
pyautogui.moveRel(x, y, duration=0.25)

2.4 滚动鼠标

pyautogui.scroll(d)。 传入一个整型,向上或向下滚动 d单位。单位的意义在每个操作系统和应用上不一样, 所以 必须试验,看看在当前情况下滚动多远。滚动发生在鼠标的当前位置。传递正整数表示向上滚动,传递负整数表示向下滚动。

3 处理屏幕

pyautogui有屏幕快照的功能,可以根据当前屏幕的内容创建图形文件。这些函数也可以返回一个Pillow的Image对象,包含当前屏幕的内容。

3.1 获取屏幕快照

调用pyautogui.screenshot()可以获取屏幕快照。

import pyautogui
img = pyautogui.screenshot()

img是屏幕快照的Image对象,img是完全不透明的,这就是让程序"看到"屏幕的方法。

3.2 分析屏幕快照

假设程序中有一步是点击灰色按钮,那么在调用click()方法之前可以进行校验,查看要点击处的像素,如果颜色和灰色按钮不一致,那么就可以知道程序出问题了。

匹配颜色:PyAutoGUI的pixelMatchesColor(x, y, (r,g,b))可以对颜色进行匹配,如果颜色一致返回true。第三个参数(r,g,b)必须是RGB颜色元组,并且颜色完全匹配才会返回True。

4 图像识别

PyAutoGUI可以同过屏幕某一部分的截图去找它在屏幕中的坐标:

>>>import pyautogui
>>>pyautogui.locateOnScreen('submit.png')
(643,745,70,29)

locateOnScreen()函数返回4个整数的元组,是屏幕上首次发现该图像时左边的x坐标、顶边的y坐标、宽度以及高度。如果屏幕上找不到该图像,locateOnScreen()函数将返回None。要成功识别屏幕上的图像必须与提供的图像完全匹配。即使只差一个像素,locateOnScreen()函数也会返回None。

如果该图像在屏幕上能够找到多处,locateAllOnScreen()函数将返回一个Generator对象。可以将它传递给list(),返回一个4整数元组的列表。(locationList=list(generator))。

5 控制键盘

5.1 输入字符串

pyautogui.typewrite()函数向计算机发送虚拟按键。这些按键产生什么效果,取决于当前获得焦点的窗口和文本输入框。(可能需要先向文本输入框发送一次鼠标点击,确保它获得焦点。)

例如:

>>> pyautogui.click( 100, 100); pyautogui.typewrite('Hello world!')
# 同一行中有两条指令用分号隔开

默认情况下,typewrite()函数将立即打印出完整字符串。可以传入可选的第二参数,在每个字符之间添加短时间暂停。
例如,pyautogui.typewrite('Helloworld!',0.25)将在打出H后等待1/4秒。打出e以后再等待1/4秒。这种渐进的打字机效果,对于较慢的应用可能有用,它们处理击键的速度不够快,跟不上pyautogui。
对于A或!这样的字符,pyautogui将自动模拟按住Shift键。

5.2 使用特殊按键(enter、shift等等)

不是所有的键都很容易用单个文本字符来表示。例如把Shift键或左箭头键,那么这些特殊键如何使用呢?
在PyAutoGUI中,这些键表示为短的字符串值:'esc'表示Esc键,'enter'表示Enter。
除了单个字符串参数,还可以向typewrite()函数传递这些键字符串的列表。例如,以下的调用表示按a键,然后是b键,然后是左箭头两次,最后是X和Y键:

>>>pyautogui.typewrite(['a','b','left','left','X','Y'])

因为按下左箭头将移动键盘光标,所以这会输出XYab。

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' PageUp和PageDown键
'home','end' Home和End键
'up','down','left','right' 上下左右箭头键
'f1','f2','f3',等等 F1至F12键
'volumemute','volumedown','volumeup' 静音、减小音量、放大音量键(有些键盘没有这些键,但你的操作系统仍能理解这些模拟的按键)
'pause' Pause键
'capslock','numlock','scrolllock' CapsLock,NumLock和ScrollLock键
'insert' Ins或Insert键
'printscreen' Prtsc或PrintScreen键
'winleft','winright' 左右Win键(在Windows上)
'command' Command键(在OSX上)
'option' Option键(在OSX上)

5.3 按下和释放键盘

就像mouseDown()和mouseUp()函数一样,pyautogui.keyDown()和pyautogui.keyUp()将向计算发送虚拟的按键和释放。它们将根据参数发送键字符串。方便起见,pyautogui提供了pyautogui.press()函数,它调用这两个函数,模拟完整的击键。

5.4 热键组合

例如,对于Ctrl-C,pyautogui.hotkey('ctrl', 'c')

对于Ctrl-Alt-Shift-S 热键组合显示 Style(样式)窗口。 只要调用hotkey('ctrl', 'alt', 'shift', 's')。

小结

本章介绍了许多不同函数,下面是快速的汇总参考:

moveTo(x,y)将鼠标移动到指定的x、y坐标。

moveRel(xOffset,yOffset)相对于当前位置移动鼠标。

dragTo(x,y)按下左键移动鼠标。

dragRel(xOffset,yOffset)按下左键,相对于当前位置移动鼠标。

click(x,y,button)模拟点击(默认是左键)。rightClick()模拟右键点击。

middleClick()模拟中键点击。

doubleClick()模拟左键双击。

mouseDown(x,y,button)模拟在x、y处按下指定鼠标按键。

mouseUp(x,y,button)模拟在x、y处释放指定键。

scroll(units)模拟滚动滚轮。正参数表示向上滚动,负参数表示向下滚动。

typewrite(message)键入给定消息字符串中的字符。

typewrite([key1,key2,key3])键入给定键字符串。

press(key)按下并释放给定键。

keyDown(key)模拟按下给定键。

keyUp(key)模拟释放给定键。

hotkey([key1,key2,key3])模拟按顺序按下给定键字符串,然后以相反的顺序释放。

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

推荐阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 4,114评论 0 13
  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,119评论 9 467
  • 我记得上高中的时候,大部分同学用的是按键型的诺基亚啊、htc啊、oppo啊之类的。也有几个用的是触屏的,那时候已经...
    Nanguayaa阅读 110评论 0 0
  • 食色性也,人类的性与动物的性区别在于,人类的性因为被赋予了心理的需求而异化。从性行为的本质上来说应该就是繁衍种族后...
    徐敬东阅读 1,582评论 1 1
  • 相互商讨参加聚会 大亲友:你脸皮这么薄,不要开口拒绝别人了 鱼大:你这是赤裸裸的伤害我,会被惩罚的 大亲友:我不怕...
    我有第三只眼阅读 101评论 0 0