使用Python控制鼠标、键盘和自动化操作

本文最后更新于:2021年11月23日 晚上

使用pyautogui这个库,来达到和按键精灵差不多的效果。可以运行在多平台。

PyAutoGUI的五个特点:

  • 移动鼠标点击或输入其他应用程序的窗口。
  • 按键发送给应用程序(例如,填写表格)。
  • 截图,给定一个图像(例如,一个按钮或复选框),在屏幕上找到它。
  • 定位应用程序的窗口,和移动,调整,最大化、最小化、关闭(仅适用于windows,目前)
  • 显示消息框进行用户交互,而您的GUI自动化脚本运行。

一: 安装pyautogui库

pip3 install pyautogui

ubuntu系统,可能需要sudo apt-get install python3-tk python3-dev,如果安装不上,请参考官方文档如何安装

二: 使用方法

官方文档

2.1 常规功能

1
2
3
4
5
6
7
8
>>> import pyautogui
>>> pyautogui.position() # 当前鼠标 x, y坐标
(968, 56)
>>> pyautogui.size() # 当前屏幕分辨率宽和高
(1920, 1080)
>>> pyautogui.onScreen(x, y) # 鼠标坐标x且y,在屏幕内
True
>>> pyautogui.PAUSE = 2.5 # 在每次PyAutoGUI调用之后设置2.5秒的暂停:

2.2 鼠标功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# XY坐标在屏幕的左上角具有0、0的原点。X向右增加,Y向向下增加。

# 移动鼠标
>>> pyautogui.moveTo(x, y, duration=num_seconds) # num秒内移动鼠标到XY坐标
>>> pyautogui.move(xOffset, yOffset, duration=num_seconds) # 相对于当前位置,鼠标移动XY
# 如果duration为0或未指定,则立即移动,duration以秒为单位。
# 例: pyautogui.move(300, 200, 2)

# 拖拽鼠标
>>> pyautogui.dragTo(x, y, duration=num_seconds) # 拖拽鼠标到XY
>>> pyautogui.drag(xOffset, yOffset, duration=num_seconds) # 相对于当前位置,鼠标拖拽XY
# 例: pyautogui.drag(300, 200, 2)

# 点击鼠标
# 调用click()即在鼠标的当前位置左键单击一次,但是关键字参数可以改变它:
>>> pyautogui.click(x=moveToX, y=moveToY, clicks=num_of_clicks, interval=secs_between_clicks, button='left')
# clicks关键字控制点击次数;interval关键字控制点击时间间隔。
# 该button关键字参数可以是'left','middle'或'right'。即左击,中击,右击。
# 例:pyautogui.click(300, 200,clicks=2,interval=3,button='right')

# 右击,中击及双、三击
>>> pyautogui.rightClick(x=moveToX, y=moveToY)
>>> pyautogui.middleClick(x=moveToX, y=moveToY)
>>> pyautogui.doubleClick(x=moveToX, y=moveToY) # 双击
>>> pyautogui.tripleClick(x=moveToX, y=moveToY) # 三击

# 鼠标中键滚动
# 正向滚动将向上滚动,负向滚动将向下滚动:
>>> pyautogui.scroll(amount_to_scroll, x=moveToX, y=moveToY)
# 例: pyautogui.scroll(-10)

# 鼠标按下或者弹起:
>>> pyautogui.mouseDown(x=moveToX, y=moveToY, button='left')
>>> pyautogui.mouseUp(x=moveToX, y=moveToY, button='left')

2.3 键盘功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 在键盘光标所在的位置按键。

# 输入字符串
>>> pyautogui.write('Hello world!\n', interval=secs_between_keys) # 用于输入文本,回车换行
# interval是字母输入间隔时间

# 依次按下键盘
# 也可以传递键名列表:
>>> pyautogui.write(['a', 'b', 'c', 'left', 'backspace', 'enter', 'f1'], interval=secs_between_keys)
# 键名的完整列表在pyautogui.KEYBOARD_KEYS中。
# 例: pyautogwrite(['a', 'b', 'c'], interval=0.25)

# 多次按键
>>> pyautogui.press(['left', 'left', 'left'])
# 或者你可以设置按多少次左键 :
>>> pyautogui.press('1', presses=3)

# 键盘快捷键(如Ctrl-S或Ctrl-Shift-1)可以通过将键名列表传递给来完成hotkey():
>>> pyautogui.hotkey('ctrl', 'c') # ctrl-c to copy
>>> pyautogui.hotkey('ctrl', 'v') # ctrl-v to paste

# 键盘按下和弹起可以分别调用:
>>> pyautogui.keyDown(key_name)
>>> pyautogui.keyUp(key_name)

2.4 消息框的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# PyAutoGUI利用PyMsgBox消息框功能提供跨平台的,纯Python方法显示javascript式消息框。 有四个消息框功能。

# alert显示()函数
>>> alert(text='', title='', button='OK')
# 显示一个简单的消息框,文本和一个OK按钮。 返回文本的按钮点击。
# 例:pyautogui.alert('这将显示一些文本和OK按钮.')

# confirm确认()函数
>>> confirm(text='', title='', buttons=['OK', 'Cancel'])
# 显示一个消息框好和取消按钮。 数量和文本的按钮可以定制。 返回文本的按钮点击。
# 例: pyautogui.confirm('显示文本和OK及取消键。')

# prompt提示()函数
>>> prompt(text='', title='' , default='')
# 显示一个消息框,文本输入,OK和Cancel按钮。 返回输入的文本,或没有,如果点击取消。
# 例: pyautogui.prompt(text='显示文本输入框,OK及取消键', title='标题' , default='')

# password密码()函数
>>> password(text='', title='', default='', mask='*')
# 显示一个消息框,文本输入,OK和Cancel按钮。 输入字符显示为 * 。 返回输入的文本,或没有,如果点击取消。
# 例: pyautogui.password(text='显示文本输入框,OK及取消键', title='标题' , default='默认密码' , mask='*')

2.5 屏幕截图功能

在ubuntu系统中支持的不是很好,比较复杂。
具体参照官方文档

还可以根据色块或图片返回对应的坐标。这个就比较强大啦。比如可以制作自动游戏脚本等等。

三: 实战演练

3.1 实时显示鼠标位置

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pyautogui, sys
print('Press Ctrl-C to quit.')
try:
while True:
x, y = pyautogui.position()
positionStr = 'X: ' + str(x).rjust(4) + ' Y: ' + str(y).rjust(4)
print(positionStr, end='')
print('\b' * len(positionStr), end='', flush=True)
except KeyboardInterrupt:
print('\n')

3.2 画图软件中画出方形螺旋图

1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/python3
# -*- coding: utf-8 -*-

import pyautogui
distance = 200
while distance > 0:
pyautogui.drag(distance, 0, duration=0.5) # move right
distance -= 5
pyautogui.drag(0, distance, duration=0.5) # move down
pyautogui.drag(-distance, 0, duration=0.5) # move left
distance -= 5
pyautogui.drag(0, -distance, duration=0.5) # move up

3.3 自动化软件 BY 不高兴就喝水

1、首先新建个名称为cmd.xls的excel文件,按如下格式输入操作内容;随后将点击步骤的图片保存为.png格式并保存在同一文件夹。

指令类型(1 单击 2 双击 3 右键 4 输入 5 等待 6滚轮(一般取-30)) 内容(图片名称.png、输入内容、等待时长/秒) 重复次数(-1代表一直重复)
1 WeiJian.png
5 0.1
1 ZhengChang.png

2、在CMD中安装Pip install xlrd pyautogui==0.9.50 opencv-python pillow

3、复制如下代码,黏贴为.py后缀的文件并执行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
import pyautogui
import time
import xlrd
import pyperclip
import sys

#定义鼠标事件

#pyautogui库其他用法 https://blog.csdn.net/qingfengxd1/article/details/108270159

def mouseClick(clickTimes,lOrR,img,reTry):
if reTry == 1:
while True:
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.1,duration=0.1,button=lOrR)
break
print("未找到匹配图片,0.1秒后重试")
time.sleep(0.1)
elif reTry == -1:
while True:
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.1,duration=0.1,button=lOrR)
time.sleep(0.1)
elif reTry > 1:
i = 1
while i < reTry + 1:
location=pyautogui.locateCenterOnScreen(img,confidence=0.9)
if location is not None:
pyautogui.click(location.x,location.y,clicks=clickTimes,interval=0.1,duration=0.1,button=lOrR)
print("重复")
i += 1
time.sleep(0.1)


# 数据检查
# cmdType.value 1.0 左键单击 2.0 左键双击 3.0 右键单击 4.0 输入 5.0 等待 6.0 滚轮
# ctype 空:0
# 字符串:1
# 数字:2
# 日期:3
# 布尔:4
# error:5
def dataCheck(sheet1):
checkCmd = True
#行数检查
if sheet1.nrows<2:
print("没数据啊哥")
checkCmd = False
#每行数据检查
i = 1
while i < sheet1.nrows:
# 第1列 操作类型检查
cmdType = sheet1.row(i)[0]
if cmdType.ctype != 2 or (cmdType.value != 1.0 and cmdType.value != 2.0 and cmdType.value != 3.0
and cmdType.value != 4.0 and cmdType.value != 5.0 and cmdType.value != 6.0):
print('第',i+1,"行,第1列数据有毛病")
checkCmd = False
# 第2列 内容检查
cmdValue = sheet1.row(i)[1]
# 读图点击类型指令,内容必须为字符串类型
if cmdType.value ==1.0 or cmdType.value == 2.0 or cmdType.value == 3.0:
if cmdValue.ctype != 1:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 输入类型,内容不能为空
if cmdType.value == 4.0:
if cmdValue.ctype == 0:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 等待类型,内容必须为数字
if cmdType.value == 5.0:
if cmdValue.ctype != 2:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
# 滚轮事件,内容必须为数字
if cmdType.value == 6.0:
if cmdValue.ctype != 2:
print('第',i+1,"行,第2列数据有毛病")
checkCmd = False
i += 1
return checkCmd

#任务
def mainWork(img):
i = 1
while i < sheet1.nrows:
#取本行指令的操作类型
cmdType = sheet1.row(i)[0]
if cmdType.value == 1.0:
#取图片名称
img = sheet1.row(i)[1].value
reTry = 1
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(1,"left",img,reTry)
print("单击左键",img)
#2代表双击左键
elif cmdType.value == 2.0:
#取图片名称
img = sheet1.row(i)[1].value
#取重试次数
reTry = 1
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(2,"left",img,reTry)
print("双击左键",img)
#3代表右键
elif cmdType.value == 3.0:
#取图片名称
img = sheet1.row(i)[1].value
#取重试次数
reTry = 1
if sheet1.row(i)[2].ctype == 2 and sheet1.row(i)[2].value != 0:
reTry = sheet1.row(i)[2].value
mouseClick(1,"right",img,reTry)
print("右键",img)
#4代表输入
elif cmdType.value == 4.0:
inputValue = sheet1.row(i)[1].value
pyperclip.copy(inputValue)
pyautogui.hotkey('ctrl','v')
time.sleep(0.5)
print("输入:",inputValue)
#5代表等待
elif cmdType.value == 5.0:
#取图片名称
waitTime = sheet1.row(i)[1].value
time.sleep(waitTime)
print("等待",waitTime,"秒")
#6代表滚轮,一般取-30
elif cmdType.value == 6.0:
#取图片名称
scroll = sheet1.row(i)[1].value
pyautogui.scroll(int(scroll))
print("滚轮滑动",int(scroll),"距离")
i += 1

if __name__ == '__main__':
file = 'cmd.xls'
#打开文件
wb = xlrd.open_workbook(filename=file)
#通过索引获取表格sheet页
sheet1 = wb.sheet_by_index(0)
print('欢迎使用自动化操作脚本')
#数据检查
checkCmd = dataCheck(sheet1)
if checkCmd:
key=int(input('输入数字选择循环几次,0则循环到死,负数则退出 \n'))
#循环拿出每一行指令
if key>0:
for i in range(0,key):
mainWork(sheet1)
elif key==0:
while True:
mainWork(sheet1)
time.sleep(0.2)
print("等待0.2秒")
elif key<0:
print("即将退出...")
sys.exit(0)
else:
print('输入有误或者已经退出!')

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!