参考【知乎burning】PyAutoGUI——图形用户界面自动化
最后更新日期:2020/8/13
更新说明:补充鼠标坐标定位方法
咱中国人 就没怕过美国!为中华之崛起而读书!
pyautogui官方文档
PyAutoGUI用屏幕的xy坐标进行定位,可以控制鼠标的操作、触发键盘操作,非常适合完成windows/linux桌面系统中无聊重复的工作。
原点是屏幕左上角,向右x坐标
增大,向下y坐标
增大,绝对坐标都是正整数
。
pyautogui.size()
Size(width=2560, height=1440)
;(0, 0)
(2559, 1439)
# 当前鼠标所在坐标
Point(x=1960, y=279)
# 绝对移动 移动到(1100, 400),耗时.7秒
pyautogui.moveTo(x=1100, y=400, duration=0.7)
# 相对移动 相对于当前鼠标位置移动偏移量(-10, -40),即往左10像素、上40像素
pyautogui.moveRel(xOffset=-10, yOffset=-40)
# 按下左键
pyautogui.mouseDown()
# 释放左键
pyautogui.mouseUp()
# 按下释放一次左键
pyautogui.click()
# 左击一次
pyautogui.click(clicks=1, button='left', interval=0.05)
# 双击左键
pyautogui.doubleClick()
# 单击右键
pyautogui.rightClick()
# 点击中键
pyautogui.middleClick()
# 绝对拖动 默认按住左键拖动到(500, 700),用时1秒
pyautogui.dragTo(x=500, y=700, duration=1)
# 相对拖动 按住右键拖动偏移量(500, -20) 相对于当前鼠标向右500像素,向上20像素,用时1秒
pyautogui.dragRel(xOffset=500, yOffset=-20, button='right', duration=1)
# 滚动 屏幕向上滚动100像素
pyautogui.scroll(-100)
做了几个案例后,发现鼠标的定位是个难题,这里提供一个方便开发的工具:
pyautogui.mouseInfo()
例如我们现在写一个打开桌面回收站并清理的自动化代码,需要如下几个步骤(电脑坏了,待补充!!)
pyautogui.typewrite(['t', 'e', 's', 't', 'left', 'left', 'left', 'left', 'M', 'S', 'G'], interval=.2) # 英文输入 只能单个字符或者一个按键 left代表方向键
pyautogui.keyDown('w') # 按下w
pyautogui.keyUp('w') # 释放w
pyautogui.press('end') # 封装上两步操作,按下并释放end键
pyautogui.hotkey('ctrl', 'v') # 热键ctrl+v
pyautogui.hotkey('ctrl', 'v')
与下面四句同效果:
pyautogui.keyDown('ctrl')
pyautogui.keyDown('v')
pyautogui.keyUp('v')
pyautogui.keyUp('ctrl')
关于键盘操作的方法可以输入的字符串有如下:
键盘键字符串 含义
'a','b','c','A','C','1','2','3', 单个字符的键
'!','@','#'等
'enter' 回车
‘esc' ESC键
'shiftleft','shiftright' 左右Shift键
'altleft','altright' 左右Alt键
'ctrlleft','ctrlright' 左右Ctrl键
‘tab'(or '\t') Tab键
'backspace','delete' Backspace键和Delete键
'pageup','pagedown' Page Up 和Page Down键
'home','end' Home键和End键
'up','down','left','right' 上下左右箭头键
'f1','f2','f3'等 F1至F12键
'volumemute','volumeup',volumedown' 静音,放大音量和减小音量键
'pause' 暂停键
'capslock','numlock','scrolllock' Caps Lock,Num Lock和 Scroll Lock键
'insert' Insert键
'printscreen' Prtsc或Print Screen键
'winleft','winright' 左右Win键(在windows上)
'command' Command键(在OS X上)
'option' Option键(在OS X上)
暂时用到pyperclip的这一个copy功能,其他不知
pyperclip.copy(con)
再配合pyautogui.hotkey('ctrl', 'v')
复制粘贴,可以将变量con
储存的内容粘贴到某处
pyautogui
可以模拟人在图形界面移动、点击操作鼠标、键盘输入等行为,在成功尝试输入英文字符串后,发现这个库不能输入中文;
搜索一下,醒悟到可以用复制中文字符后粘贴的方式完成,于是用qq微信都做了测试:
代码如下,这个是最初学习的demo,后面还会做出更有意思的实用性的工具:
import time
import pyautogui
import pyperclip
def auto_send_msg():
'''将qq/WX聊天框置顶放在屏幕右侧,程序界面缩小到可以触发为止,保证鼠标移动位置在输入框中即可
'''
pyautogui.moveTo(x=1100, y=400, duration=0.7)
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
time.sleep(1)
pyautogui.press('shift') # shift 键切换英文
pyautogui.typewrite(['t', 'e', 's', 't', 'left', 'left', 'left', 'left', 'M', 'S', 'G'], interval=.2) # 英文输入
pyautogui.press('end') # end键
pyautogui.press('enter') # enter键
pyautogui.hotkey('ctrl', 'enter')
pyautogui.keyDown('w')
pyautogui.press('shift') # shift 键切换中文
time.sleep(2)
pyautogui.keyUp('w')
pyautogui.hotkey('ctrl', 'enter')
input_str = "/doge多喝热水(^U^)ノ~YO"
for j in range(2):
for con in input_str:
pyperclip.copy(con)
time.sleep(0.09)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.09)
# pyautogui.press('enter')
pyautogui.hotkey('ctrl', 'enter')
if __name__ == "__main__":
auto_send_msg()
import time
import pyautogui
import pyperclip
def send_zhihu_comment():
print("屏幕像素为", pyautogui.size())
time.sleep(1)
pyautogui.moveTo(x=1100, y=400, duration=0.7) # 坐标移动
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.moveRel(xOffset=-10, yOffset=-40) # 偏移移动
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.middleClick() # 单击中键
pyautogui.moveRel(xOffset=10, yOffset=20)
# 滚动测试
time.sleep(.5)
pyautogui.moveTo(x=1100, y=400, duration=0.7)
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
time.sleep(.5)
pyautogui.scroll(-100)
time.sleep(.5)
pyautogui.scroll(-100)
time.sleep(.5)
pyautogui.scroll(-100)
# 左右键和拖动测试
time.sleep(2)
pyautogui.doubleClick() # 双击左键
time.sleep(1)
pyautogui.rightClick() # 单击右键
pyautogui.dragTo(x=500, y=700, duration=1)
# 输入评论,中文输入测试
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
input_str = "up主真棒,加油!"
for j in range(1):
for con in input_str:
pyperclip.copy(con)
time.sleep(0.09)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.09)
pyautogui.dragRel(xOffset=500, yOffset=-20, duration=1)
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.moveRel(xOffset=-100, yOffset=-100)
if __name__ == "__main__":
send_zhihu_comment()
import time
import pyautogui
import pyperclip
def send_zhihu_comment():
print("屏幕像素为", pyautogui.size())
print("鼠标位置为", pyautogui.position())
time.sleep(1)
pyautogui.moveTo(x=1100, y=400, duration=0.7) # 坐标移动
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.moveRel(xOffset=-10, yOffset=-40) # 偏移移动
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.middleClick() # 单击中键
pyautogui.moveRel(xOffset=10, yOffset=20)
# 滚动测试
time.sleep(.5)
pyautogui.moveTo(x=1100, y=400, duration=0.7)
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
time.sleep(.5)
pyautogui.scroll(-100)
time.sleep(.5)
pyautogui.scroll(-100)
time.sleep(.5)
pyautogui.scroll(-100)
# 左右键和拖动测试
time.sleep(2)
pyautogui.doubleClick() # 双击左键
time.sleep(1)
pyautogui.rightClick() # 单击右键
pyautogui.dragTo(x=500, y=700, duration=1)
# 输入评论,中文输入测试
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
input_str = "up主真棒,加油!"
for j in range(1):
for con in input_str:
pyperclip.copy(con)
time.sleep(0.09)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.09)
pyautogui.dragRel(xOffset=500, yOffset=-20, button='left', duration=1) # 按住左键相对拖动
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
pyautogui.moveRel(xOffset=-100, yOffset=-100)
def auto_send_msg():
'''将qq/WX聊天框置顶放在屏幕右侧,程序界面缩小到可以触发为止,保证鼠标移动位置在输入框中即可
'''
pyautogui.moveTo(x=1100, y=400, duration=0.7)
pyautogui.click(clicks=1, button='left', interval=0.05) # 点击
time.sleep(1)
pyautogui.press('shift') # shift 键切换英文
pyautogui.typewrite(['t', 'e', 's', 't', 'left', 'left', 'left', 'left', 'M', 'S', 'G'], interval=.2) # 英文输入
pyautogui.press('end') # end键
pyautogui.press('enter') # enter键
pyautogui.hotkey('ctrl', 'enter')
pyautogui.keyDown('w')
pyautogui.press('shift') # shift 键切换中文
time.sleep(2)
pyautogui.keyUp('w')
pyautogui.hotkey('ctrl', 'enter')
input_str = "多喝热水"
for j in range(2):
for con in input_str:
pyperclip.copy(con)
time.sleep(0.09)
pyautogui.hotkey('ctrl', 'v')
time.sleep(0.09)
# pyautogui.press('enter')
pyautogui.hotkey('ctrl', 'enter')
if __name__ == "__main__":
# send_zhihu_comment()
# auto_send_msg()
# print(pyautogui.mouseInfo())
# pyautogui.moveTo(x=1227, y=329, duration=.5)
# all_wins = pyautogui.getActiveWindowTitle()
# print(all_wins)
# TODO:根据图像进行定位完成和优化速度
time.sleep(2)
record_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\record.png")
pyautogui.moveTo(record_img, duration=.5)
pyautogui.click(clicks=1, button='left', interval=0.05)
time.sleep(2)
# # 自动运行
# run_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\run.png")
# print(run_img)
# pyautogui.moveTo(run_img, duration=.5)
# pyautogui.click(clicks=1, button='left', interval=0.05)
# time.sleep(1)
# 保存位置
save_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\save.png")
print(save_img)
pyautogui.moveTo(save_img, duration=.5)
pyautogui.click(clicks=1, button='left', interval=0.05)
time.sleep(3)
# 是
# yes_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\yes.png")
# print(yes_img)
# pyautogui.moveTo(yes_img, duration=.5)
# pyautogui.click(clicks=1, button='left', interval=0.05)
# 测试案例
auto_send_msg()
time.sleep(2)
# 停止记录
stop_record_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\stop_record.png")
print(stop_record_img)
pyautogui.moveTo(stop_record_img, duration=.5)
pyautogui.click(clicks=1, button='left', interval=0.05)
# 自动关闭
stop_img = pyautogui.locateOnScreen("C:\\Users\\randolph\\Desktop\\stop.png")
print(stop_img)
pyautogui.moveTo(stop_img, duration=.5)
pyautogui.click(clicks=1, button='left', interval=0.05)
以下分别是windows环境下LICEcap截图工具、vscode按钮和我改成黑夜模式的系统按钮,用户可以根据自己的实际情况进行修改自定义~
record.png
run.png
stop.png
save.png
stop_record.png
yes.png