简介
在 Python 生态里,如果你想让程序接管鼠标和键盘,pyautogui 是个非常实用的第三方库。它不随 Python 自带,需要单独安装。虽然功能强大,但用之前最好心里有数:这玩意儿会直接操作你的系统输入设备,跑的时候别把鼠标甩飞了。
环境准备
安装很简单,直接用 pip 即可。注意,现代版本通常会自动处理依赖(如 Pillow),不需要单独折腾 image 模块了。
pip install pyautogui
鼠标控制
1. 屏幕与位置
先搞清楚你在哪块屏幕上干活。size() 能告诉你分辨率,position() 能实时反馈当前光标坐标。
import pyautogui
print(pyautogui.size()) # 输出类似 (1920, 1080)
print(pyautogui.position()) # 输出当前坐标,例如 (500, 300)
2. 移动光标
有两种移动方式:绝对定位和相对移动。
- 绝对移动:
moveTo(x, y)。参数是屏幕上的具体坐标。如果想让动作看起来自然点,可以加个duration参数控制耗时,不然鼠标会瞬移。 - 相对移动:
moveRel(x, y)。基于当前位置偏移。比如想往下挪一点,就写moveRel(0, 100)。
# 平滑移动到 (100, 100),耗时 1 秒
pyautogui.moveTo(100, 100, duration=1)
# 从当前位置向下移动 300 像素
pyautogui.moveRel(0, 300, duration=1)
3. 点击与拖拽
最常用的操作莫过于点击。click(x, y) 默认左键,可以通过 button 参数指定右键或中键。双击和右键也有专用函数 doubleClick() 和 rightClick()。
关于拖拽,dragTo 和 dragRel 类似于移动函数,区别在于它们会在移动过程中保持鼠标左键按下状态。这在自动绘图或移动窗口时很有用。
# 在 (370, 120) 处点击
pyautogui.click(370, 120)
# 模拟画板绘图:按住左键拖动
pyautogui.dragRel(100, 0, duration=1) # 向右
pyautogui.dragRel(0, 100, duration=1) # 向下
pyautogui.dragRel(-100, 0, duration=1) # 向左
pyautogui.dragRel(0, -100, duration=1) # 向上
4. 滚轮
scroll() 接受像素值,正数向上滚,负数向下滚。
pyautogui.scroll(200) # 向上滚动 200 像素
键盘控制
1. 打字
typewrite() 是最直接的输入方式。记得先确保焦点在文本框里,否则字可能打不到预期位置。
# 先点击激活输入框
pyautogui.click(100, 200)
# 输入内容
pyautogui.typewrite('hello world!')
2. 组合键与单键
除了打字,还能模拟快捷键。hotkey() 支持多键组合,比如 Ctrl+C 复制,Ctrl+V 粘贴。press() 则用于单次按键,比如回车或方向键。
# 模拟 Ctrl + V 粘贴
pyautogui.hotkey('ctrl', 'v')
# 模拟 Ctrl + Shift + Esc 打开任务管理器
pyautogui.hotkey('ctrl', 'shift', 'esc')
# 按 Enter 键
pyautogui.press('enter')
# 按 F1 键
pyautogui.press('f1')
# 按左方向键
pyautogui.press('left')
消息弹窗
调试脚本时,如果需要暂停等待用户确认,可以用内置的弹窗函数,类似 JavaScript 的体验。
alert(): 只有 OK 按钮,返回 None。confirm(): 有 OK 和 Cancel,返回对应字符串。prompt(): 带输入框,返回输入的字符串。
# 显示提示并暂停
pyautogui.alert('脚本即将开始运行,请准备好!')
# 询问是否继续
if pyautogui.confirm('确定要执行吗?') == 'OK':
print('开始执行...')
# 获取用户输入
name = pyautogui.prompt('请输入你的名字:')
小贴士
- 安全第一:运行前建议先在测试环境验证,避免误删文件或乱改设置。
pyautogui没有撤销机制。 - 延迟控制:如果操作太快导致目标没加载出来,可以在关键步骤间加入
time.sleep()。 - 截图定位:配合
screenshot()和图像识别功能,可以实现更智能的界面交互,但这属于进阶玩法了。
