pyautogui-让所有GUI都自动化!

项目介绍

官方链接

项目信息:官方文档 github地址

官方简体中文演示:简中文档

功能实现

pyautogui是一个纯python的GUI自动化库,博主主要用它实现鼠标点击、键盘输入、查图定位、像素定位等功能,这也是pyautogui的主要功能。

博主将详细介绍pyautogui的以下功能以及相关函数:

  • 鼠标函数,鼠标移动、点击、拖动等;
  • 键盘函数,按键按下、弹起、热键、模拟输入等;
  • 弹窗函数,按钮弹窗、输入弹窗等;
  • 截图函数,截图等;
  • 屏幕函数,灰度匹配、像素点匹配、图片定位等。

思维导图

点击放大,查阅,图片下面有pdf下载地址

原图PDF下载

这是好多年前博主看别人的教程整理的,大家凑活着看昂,其中的思路以及函数还是比较全面而且清晰的。

保护措施

pyautogui默认开启保护措施,即

pyautogui.FAILSAFE = True

当你的脚本在运行时,可以快速手动将鼠标移动到屏幕角落,左上角、右上角等,pyautogui在执行下一个脚本动作时就会直接抛出错误并终止脚本:

#报错信息
  File "C:\anaconda\Lib\site-packages\pyautogui\__init__.py", line 1710, in failSafeCheck
    raise FailSafeException(
pyautogui.FailSafeException: PyAutoGUI fail-safe triggered from mouse moving to a corner of the screen. To disable this fail-safe, set pyautogui.FAILSAFE to False. DISABLING FAIL-SAFE IS NOT RECOMMENDED.

要关闭安全模式可以设置为False,就不会抛出错误,当然终止脚本就没有那么容易了:

#关闭pyautogui的安全模式
pyautogui.FAILSAFE = False

鼠标函数

这里我们介绍最常用的几个鼠标函数以及它们的参数用法:

鼠标移动

鼠标移动的函数有绝对移动和相对移动,顾名思义就是一个是直接移动到坐标点,一个是相对现在的位置进行移动,函数:

pyautogui.moveTo(x, y, duration=num_seconds, tween=pyautogui.linear)
  • x 和 y:这两个参数是必须的,它们指定了鼠标指针将要移动到的屏幕坐标。坐标系的原点(0, 0)通常位于屏幕的左上角。
  • duration(可选):这是指移动鼠标指针所需的时间,以秒为单位。默认情况下,移动是瞬间完成的。如果指定了一个正数值,那么鼠标指针会在这个时间内平滑地移动到目标位置。
  • tween(可选):这是一个插值函数,用于定义鼠标移动的动画效果。默认值 pyautogui.linear 表示线性运动,即速度恒定。您还可以使用其他预定义的函数来创建加速、减速等效果,例如 pyautogui.easeInQuad, pyautogui.easeOutQuad, pyautogui.easeInOutQuad 等。

相对移动:

pyautogui.moveRel(xOffset, yOffset, duration=num_seconds, tween=pyautogui.linear)
  • xOffset 和 yOffset:这两个参数是必须的,它们指定了相对于当前鼠标位置的水平和垂直偏移量。正值会使鼠标向右(xOffset)或向下(yOffset)移动;负值则使鼠标向左或向上移动;
  • duration(可选):同上;
  • tween(可选):同上。

鼠标点击

pyautogui.click()函数用于模拟鼠标点击。它可以在指定的屏幕位置执行单击、双击或右键点击等操作。此函数具有多个参数,允许用户自定义点击的行为。

参数说明

  • x 和 y:这两个参数是可选的,它们指定了要点击的屏幕坐标。如果未提供这些参数,则在当前鼠标位置执行点击。坐标系的原点(0, 0)通常位于屏幕的左上角。
  • clicks(可选):这指定了要执行的点击次数,默认为1次。可以设置为2来执行双击,或者更大的数字以执行多次点击。
  • interval(可选):这是每次点击之间的间隔时间,以秒为单位。默认情况下没有间隔。
  • button(可选):这指定了要使用的鼠标按钮。可以是 ‘left’(默认)、’right’ 或 ‘middle’,分别对应于鼠标的左键、右键和中键。
  • duration(可选):这个参数控制移动到点击位置所需的时间(仅当提供了x和y参数时)。默认情况下,移动是瞬间完成的。
  • tween(可选):这是一个插值函数,它定义了鼠标移动的动画效果。默认使用 pyautogui.linear 表示线性运动,速度恒定。您还可以选择其他预定义的函数来创建不同的加减速效果。

import pyautogui

# 在当前位置进行一次左键点击
pyautogui.click()

# 移动到 (100, 200) 并进行两次快速点击(双击)
pyautogui.click(x=100, y=200, clicks=2)

# 在 (300, 400) 执行一次右键点击,耗时1秒移动到该位置
pyautogui.click(x=300, y=400, button='right', duration=1)

# 在 (500, 600) 进行三次点击,每次点击之间有0.5秒的间隔
pyautogui.click(x=500, y=600, clicks=3, interval=0.5)

右键、中键及双击

pyautogui库还提供了多种模拟鼠标点击的方法,包括右键点击、中键点击和双击。这些操作可以通过click()函数的不同参数组合来实现,也可以直接使用专门的函数如 rightClick() 和middleClick()。

右键点击

要执行右键点击,可以使用 pyautogui.rightClick() 或者在 pyautogui.click()中指定 button='right' 参数。

import pyautogui

# 使用 rightClick() 进行右键点击
pyautogui.rightClick()

# 或者使用 click() 并指定 button 参数
pyautogui.click(button='right')

中键点击

对于中键点击,可以使用 pyautogui.middleClick()或者在 pyautogui.click()中指定 button='middle' 参数。

import pyautogui

# 使用 middleClick() 进行中键点击
pyautogui.middleClick()

# 或者使用 click() 并指定 button 参数
pyautogui.click(button='middle')

双击

要执行双击,可以直接调用 pyautogui.doubleClick(),或者在 pyautogui.click()中设置 clicks=2 参数。

import pyautogui

# 使用 doubleClick() 进行双击
pyautogui.doubleClick()

# 或者使用 click() 并指定 clicks 参数
pyautogui.click(clicks=2)

上述方法均可以在不提供坐标的情况下于当前鼠标位置执行相应的点击操作,也可以通过传递 xy 参数来指定点击的具体位置。

鼠标滚轮

pyautogui 库不仅支持模拟鼠标点击和移动,还提供了 hscroll 和 vscroll 函数来模拟鼠标滚轮的水平和垂直滚动行为。这对于自动化网页浏览、文档查看等任务非常有用。

垂直滚动 (vscroll)

使用 pyautogui.vscroll 可以模拟垂直方向上的滚动。此函数接受一个参数 amount_to_scroll,表示滚动的“刻度”数量。正值表示向上滚动,负值表示向下滚动。

import pyautogui

# 向上滚动 10 个刻度
pyautogui.vscroll(10)

# 向下滚动 10 个刻度
pyautogui.vscroll(-10)

您还可以指定滚动的位置(即鼠标指针所在位置),通过传递 x 和 y 参数。

# 在屏幕坐标 (500, 500) 处向下滚动 10 个刻度
pyautogui.vscroll(-10, x=500, y=500)

水平滚动 (hscroll)

同样地,pyautogui.hscroll 用于模拟水平方向上的滚动。它也接受一个参数 amount_to_scroll,正值表示向右滚动,负值表示向左滚动。

import pyautogui

# 向右滚动 10 个刻度
pyautogui.hscroll(10)

# 向左滚动 10 个刻度
pyautogui.hscroll(-10)

与 vscroll 类似,您也可以为 hscroll 指定具体的滚动位置。

# 在屏幕坐标 (500, 500) 处向左滚动 10 个刻度
pyautogui.hscroll(-10, x=500, y=500)

鼠标拖拽

pyautogui 库提供了 dragTo 和 dragRel 函数,用于模拟鼠标在屏幕上拖动的行为。这两个函数可以用来实现如绘制图形、选择文本或移动窗口等操作。

拖拽绝对位置

使用 pyautogui.dragTo 可以将鼠标指针从当前位置拖动到屏幕上的一个绝对坐标位置。此函数接受多个参数来定制化拖动行为。

import pyautogui

# 将鼠标拖动到坐标 (100, 200),耗时2秒
pyautogui.dragTo(100, 200, duration=2)

# 使用线性插值函数拖动鼠标到坐标 (300, 400),耗时1秒
pyautogui.dragTo(300, 400, duration=1, tween=pyautogui.linear)

  • xy:必须的参数,指定要拖动到的屏幕坐标。
  • duration(可选):定义了拖动所需的时间,以秒为单位。默认情况下是瞬间完成。
  • tween(可选):这是一个插值函数,它定义了鼠标拖动的动画效果,默认使用 pyautogui.linear 表示线性运动。
  • button(可选):指定哪个鼠标按钮被按下进行拖动,默认是左键。

拖拽相对位置

pyautogui.dragRel 则是在当前鼠标位置的基础上进行相对拖动。这意味着你可以指定相对于当前位置的水平和垂直偏移量来进行拖动。

import pyautogui

# 向右拖动50个像素点,向下拖动30个像素点,耗时1秒
pyautogui.dragRel(50, 30, duration=1)

# 向左拖动40个像素点,向上拖动20个像素点,耗时0.5秒,并使用 easeInOutQuad 插值函数
pyautogui.dragRel(-40, -20, duration=0.5, tween=pyautogui.easeInOutQuad)

  • xOffsetyOffset:必须的参数,指定相对于当前位置的水平和垂直偏移量。
  • 其它参数同dragTo。

键盘函数

键盘输入

pyautogui 库中的 typewrite 函数用于模拟键盘输入,可以用来自动化文本输入任务。此函数允许用户指定要输入的字符串以及每个字符之间的间隔时间。

基本用法

使用 typewrite 可以轻松地让程序自动输入文本。以下是该函数的基本参数说明:

import pyautogui

# 输入字符串 "Hello, World!",每个字符之间暂停 0.25 秒
pyautogui.typewrite('Hello, World!', interval=0.25)

  • message:必须的参数,表示要输入的字符串。
  • interval(可选):每个字符之间的暂停时间,默认是无间隔。这个参数可以帮助模拟更自然的打字速度。

高级用法

除了输入普通文本外,typewrite 还可以结合其他 pyautogui 函数来实现更复杂的键盘操作,例如按下组合键或特殊键。

import pyautogui

# 输入 "username" 并按 Tab 键切换到下一个输入框,再输入 "password"
pyautogui.typewrite('username')
pyautogui.press('tab')  # 按下 Tab 键
pyautogui.typewrite('password')

# 输入文本后按下 Enter 键提交表单
pyautogui.typewrite('search term', interval=0.1)
pyautogui.press('enter')

您可以使用 press 函数来发送单独的按键事件,包括功能键、箭头键等。对于需要同时按下的组合键,可以使用 hotkey 函数。

# 按下 Ctrl + C 组合键复制选定内容
pyautogui.hotkey('ctrl', 'c')

# 按下 Ctrl + V 组合键粘贴内容
pyautogui.hotkey('ctrl', 'v')

模拟按键

pyautogui 库中的 press 函数用于模拟按下和释放单个键盘按键。这对于自动化任务如打开菜单、切换选项或提交表单非常有用。press 函数可以发送标准按键事件,也可以发送特殊键(如功能键、箭头键等)。

基本用法

使用 press 可以轻松地让程序自动按下指定的键。以下是该函数的基本参数说明:

import pyautogui

# 按下并释放 "enter" 键
pyautogui.press('enter')

# 按下并释放 "tab" 键
pyautogui.press('tab')

  • keys:必须的参数,表示要按下的按键。可以是字符串形式的单个键名,也可以是一系列键名组成的列表或元组。
  • presses(可选):指定按键被按下的次数,默认为1次。
  • interval(可选):每次按键之间的暂停时间,默认是无间隔。这个参数可以帮助模拟更自然的按键节奏。

# 按下 "space" 键两次,每次之间暂停 0.5 秒
pyautogui.press('space', presses=2, interval=0.5)

# 依次按下多个键,如 "left", "right"
pyautogui.press(['left', 'right'], interval=0.1)

支持的按键名称

pyautogui 支持多种按键名称,包括字母、数字、符号以及特殊键。以下是一些常见的按键名称示例:

  • 普通字符:’a’, ‘b’, ‘c’, …, ‘1’, ‘2’, ‘3’, …
  • 特殊字符:’enter’, ‘esc’, ‘space’, ‘tab’
  • 功能键:’f1′, ‘f2’, …, ‘f12’
  • 导航键:’left’, ‘right’, ‘up’, ‘down’
  • 编辑键:’backspace’, ‘delete’
  • 其他:’home’, ‘end’, ‘insert’

如果需要模拟组合键(例如 Ctrl+C 或 Ctrl+V),应使用 hotkey 函数而不是单独调用 press。hotkey 函数允许同时按下多个键。

热键

pyautogui 库中的 hotkey 函数用于模拟同时按下多个键盘按键,这对于执行快捷键操作(如复制、粘贴、保存等)非常有用。通过 hotkey 函数,您可以自动化这些常见的键盘快捷方式,从而提高工作效率。

基本用法

使用 hotkey 可以轻松地让程序自动按下并释放一系列按键。以下是该函数的基本参数说明:

import pyautogui

# 模拟 Ctrl + C 组合键(复制)
pyautogui.hotkey('ctrl', 'c')

# 模拟 Ctrl + V 组合键(粘贴)
pyautogui.hotkey('ctrl', 'v')

  • keys:必须的参数,表示要按下的按键。可以是字符串形式的单个键名,也可以是一系列键名组成的列表或元组。每个键之间会同时按下和释放。
  • interval(可选):每次按键之间的暂停时间,默认是无间隔。这个参数可以帮助模拟更自然的按键节奏,但在大多数情况下,对于组合键来说并不是必需的。

# 模拟 Alt + Tab 组合键切换应用程序
pyautogui.hotkey('alt', 'tab')

多按键组合

hotkey 函数还可以处理更多按键的组合。例如,某些快捷键可能涉及三个或更多的按键。在这种情况下,只需将所有按键作为参数传递给 hotkey 即可。

# 模拟 Ctrl + Shift + Esc 组合键打开任务管理器
pyautogui.hotkey('ctrl', 'shift', 'esc')

# 模拟 Windows + L 组合键锁定计算机
pyautogui.hotkey('winleft', 'l')

模拟按键2

模拟按键返场,并非穿越,而是在模拟按键中press是按下弹起一次性完成,而有时候我们需要按下和弹起拆解完成,或者需要按下不弹起的场景,那么就需要keyDown和keyUp函数:

pyautogui 库中的 keyDown 和 keyUp 函数用于模拟单独的按键事件,分别对应于按键按下和按键释放。这两个函数允许更细粒度地控制键盘输入,特别是在需要模拟长按某个键或组合键的情况下。

基本用法

使用 keyDown 和 keyUp 可以精确控制按键的时间点,这对于某些特定的自动化任务非常有用。以下是这两个函数的基本参数说明:

import pyautogui

# 模拟按下 "shift" 键
pyautogui.keyDown('shift')

# 模拟释放 "shift" 键
pyautogui.keyUp('shift')

  • key:必须的参数,表示要按下的按键名。可以是单个字符(如 ‘a’)、功能键(如 ‘f1’)、特殊键(如 ‘enter’)等。

模拟长按按键

通过结合 keyDown 和 keyUp,您可以模拟长按某个键的效果。例如,在游戏中可能需要长按方向键来移动角色。

# 模拟长按 "left" 箭头键 5 秒钟
pyautogui.keyDown('left')
pyautogui.sleep(5)  # 暂停 5 秒
pyautogui.keyUp('left')

模拟组合键

对于需要同时按下的组合键,您可以先调用 keyDown 来按下所有按键,然后再调用 keyUp 来释放它们。这种方式特别适用于那些不能通过 hotkey 函数直接模拟的复杂组合键。

# 模拟 Ctrl + Shift + C 组合键
pyautogui.keyDown('ctrl')
pyautogui.keyDown('shift')
pyautogui.press('c')  # 按下并立即释放 'c'
pyautogui.keyUp('shift')
pyautogui.keyUp('ctrl')

弹窗函数

在我刚接触pyautogui时,我就很喜欢用它的弹窗函数,因为不会GUI界面…pyautogui的弹窗函数基于Tkinter,它实现了4种纯Python的消息弹窗函数:alert、confirm、prompt、password。我分别介一下它们:

弹出警告框 (alert)

pyautogui 库中的 alert 函数用于显示一个简单的消息弹窗,通常用来在自动化脚本中提醒用户某些信息或状态。这个弹窗包含一条消息和一个“确定”按钮,用户需要点击该按钮来关闭弹窗。

alert 函数非常简单易用,它只需要一个参数,即要显示的消息文本。以下是该函数的基本用法:

import pyautogui

# 显示一个带有 "Hello, World!" 消息的警告框
pyautogui.alert('Hello, World!')

  • text:必须的参数,表示要显示的消息文本。
  • title(可选):设置弹窗标题,默认为 ‘PyAutoGUI’。
  • button(可选):设置按钮上的文本,默认为 ‘OK’。

# 自定义标题和按钮文本
pyautogui.alert(text='程序即将开始', title='提示', button='确定')

使用场景

alert 函数适用于以下几种情况:

  • 在脚本执行关键步骤之前,提醒用户确认。
  • 当脚本遇到错误或异常时,向用户报告问题。
  • 作为调试工具,在特定位置插入警报以检查代码流。

确认对话框 (confirm)

pyautogui 库中的 confirm 函数用于显示一个确认对话框,通常用来在自动化脚本中向用户提出问题并等待用户选择“是”或“否”。这个对话框包含一条消息、一个标题(可选)以及两个按钮:“OK”和“Cancel”。根据用户的点击,函数返回相应的字符串值。

基本用法

confirm 函数允许您通过弹窗与用户进行简单的交互。以下是该函数的基本参数说明:

import pyautogui

# 显示一个带有 "Do you want to continue?" 消息的确认对话框
response = pyautogui.confirm('Do you want to continue?')

# 根据用户的选择执行不同的操作
if response == 'OK':
    print('User chose OK')
elif response == 'Cancel':
    print('User chose Cancel')

  • text:必须的参数,表示要显示的消息文本。
  • title(可选):设置对话框标题,默认为 ‘PyAutoGUI’。
  • buttons(可选):指定按钮列表,默认为 [‘OK’, ‘Cancel’]。您可以自定义按钮文本,例如 [‘Yes’, ‘No’]。

# 自定义标题和按钮文本
response = pyautogui.confirm(text='Are you sure?', title='Confirmation', buttons=['Yes', 'No'])

if response == 'Yes':
    print('User confirmed the action.')
elif response == 'No':
    print('User declined the action.')

使用场景

confirm 函数适用于以下几种情况:

  • 在执行不可逆操作之前,如删除文件或提交表单,确保用户确实希望继续。
  • 作为流程控制的一部分,在关键步骤前获取用户的同意。
  • 测试或调试过程中,插入确认点以验证程序状态。

输入对话框 (prompt) 的用法

pyautogui 库中的 prompt 函数用于显示一个带有输入框的对话框,通常用来在自动化脚本中从用户那里获取文本输入。这个对话框包含一条消息、一个标题(可选)、一个默认值(可选)以及“OK”和“Cancel”按钮。根据用户的输入或选择,函数返回相应的字符串值或 None。

prompt 函数允许您通过弹窗与用户进行简单的交互,并收集他们提供的文本信息。以下是该函数的基本参数说明:

import pyautogui

# 显示一个带有 "Enter your name:" 消息的输入对话框
user_input = pyautogui.prompt('Enter your name:')

# 根据用户的输入执行不同的操作
if user_input is not None:
    print(f'User entered: {user_input}')
else:
    print('User canceled the input.')

  • text:必须的参数,表示要显示的消息文本。
  • title(可选):设置对话框标题,默认为 ‘PyAutoGUI’。
  • default(可选):设置输入框中的默认文本,默认为空字符串。

# 自定义标题和默认值
user_input = pyautogui.prompt(text='What is your favorite color?', title='Color Survey', default='Blue')

if user_input is not None:
    print(f'User\'s favorite color is: {user_input}')
else:
    print('User canceled the input.')

prompt 函数适用于以下几种情况:

  • 在自动化过程中需要用户提供某些信息时,如用户名、密码或其他个性化数据。
  • 作为调试工具,在特定位置插入提示以检查代码流或获取用户反馈。
  • 当脚本需要动态调整其行为时,例如根据用户的输入来改变后续的操作。

注意事项

虽然 prompt 函数可以有效地与用户交互,但在自动化过程中频繁使用可能会中断流程。所以这个一般放在开头获取一些信息比较合适;

而且一定要注意,prompt的返回值是str,如果输入一些数字、或其他非字符串类型的数据要注意在使用前进行转换。

密码输入对话框 (password)

pyautogui 库中的 password 函数用于显示一个带有输入框的对话框,专门用来在自动化脚本中安全地从用户那里获取密码或其他敏感信息。这个对话框包含一条消息、一个标题(可选)、一个默认值(可选)以及“OK”和“Cancel”按钮。与 prompt 不同的是,password 对话框中的输入会被掩码处理,通常显示为星号(*)或圆点,以保护用户的隐私。

这个函数用到的太少了,有点食之无味的意思,获取隐私数据我有更好的函数或方法。

password 函数允许您通过弹窗安全地收集用户的密码或敏感信息。以下是该函数的基本参数说明:

import pyautogui

# 显示一个带有 "Enter your password:" 消息的密码输入对话框
user_password = pyautogui.password('Enter your password:')

# 根据用户的输入执行不同的操作
if user_password is not None:
    print('Password entered successfully.')
else:
    print('User canceled the input.')

  • text:必须的参数,表示要显示的消息文本。
  • title(可选):设置对话框标题,默认为 ‘PyAutoGUI’。
  • default(可选):设置输入框中的默认文本,默认为空字符串。
  • mask(可选):指定用于遮蔽输入字符的符号,默认为 ‘*’。

# 自定义标题、默认值和遮罩符号
user_password = pyautogui.password(text='Enter your secret code:', title='Security Check', default='', mask='#')

if user_password is not None:
    print('Secret code entered successfully.')
else:
    print('User canceled the input.')

password 函数适用于以下几种情况:

  • 需要用户输入密码或 PIN 码来验证身份。
  • 收集敏感信息,如银行账户详情或私人密钥。
  • 确保用户提供的信息不会被旁观者看到,提高安全性。

屏幕函数

这类函数需要先安装Pillow/PIL,这两个库都是专门处理图像的,如果缺少依赖会报错,可以直接pip安装一下。

这个类别中有很多函数,涉及简单的截图保存、图像定位、图像查找等,感兴趣的同学可以去官方文档了解更多玩法,本文只介绍一些简单的函数,毕竟博主只是财务啊…

截图函数

pyautogui 库中的 screenshot 函数用于捕获屏幕的图像快照,这在自动化测试、监控系统状态或记录操作过程中非常有用。该函数返回一个 PIL(Python Imaging Library)Image 对象,您可以将其保存为文件或进一步处理。

screenshot 函数允许您轻松地获取整个屏幕或特定区域的快照。以下是该函数的基本参数说明和使用示例:

import pyautogui

# 捕获整个屏幕并保存为 'screenshot.png'
pyautogui.screenshot('screenshot.png')

# 或者将截图存储到变量中而不立即保存
image = pyautogui.screenshot()

# 之后可以使用 Pillow 库的功能来处理这个 Image 对象,例如显示图片
image.show()

  • filename(可选):指定保存截图的文件名和路径。如果不提供此参数,则不会自动保存到文件,而是返回一个 Image 对象。
  • region(可选):定义要捕获的屏幕矩形区域,格式为 (left, top, width, height)。这有助于减少不必要的数据量,并专注于特定的兴趣区域。

# 捕获屏幕左上角 500x500 像素的区域并保存
pyautogui.screenshot('region_screenshot.png', region=(0, 0, 500, 500))

当使用 screenshot 函数时,请注意以下几点:

  • 捕获大分辨率屏幕的截图可能会消耗较多内存和处理时间。
  • 识别定位函数

    pyautogui 库中的 locateOnScreen 函数用于在屏幕上查找指定图像的位置。这在自动化任务中非常有用,例如当您需要根据屏幕上的某个图标或按钮的位置来执行操作时。locateOnScreen 返回的是一个包含图像位置和大小的元组,格式为 (left, top, width, height),如果未找到匹配项则返回 None。

    使用 locateOnScreen 可以轻松地定位屏幕上的特定元素。以下是该函数的基本参数说明和使用示例:

    import pyautogui
    
    # 查找名为 'button.png' 的图像在屏幕上的位置
    location = pyautogui.locateOnScreen('button.png')
    
    if location is not None:
        print(f"Found the button at: {location}")
    else:
        print("Button not found on screen.")

    • needleImage:必须的参数,表示要查找的图像文件路径。可以是绝对路径也可以是相对路径。
    • confidence(可选):设置图像匹配的置信度阈值,默认值依赖于操作系统,一般为 0.9 左右。较低的值会更容易找到匹配项,但可能会有误报。
    • region(可选):定义要搜索的屏幕矩形区域,格式为 (left, top, width, height)。这有助于加速搜索过程并减少误报。

    # 使用置信度和限定区域进行更精确的查找
    location = pyautogui.locateOnScreen('button.png', confidence=0.8, region=(100, 100, 500, 500))
    
    if location is not None:
        print(f"Found the button at: {location}")
    else:
        print("Button not found in specified region.")

    除了基本的图像定位外,pyautogui 还提供了其他辅助函数来简化基于图像的自动化流程:

    • locateAllOnScreen:返回所有匹配图像的位置迭代器,而不是仅第一个匹配项。
    • locateCenterOnScreen:返回匹配图像中心点的坐标 (x, y),方便直接用于点击等操作。
    • center:从 locateOnScreen 返回的结果中提取中心点坐标。

    # 查找所有匹配项并获取其中心点坐标
    for pos in pyautogui.locateAllOnScreen('icon.png'):
        center_pos = pyautogui.center(pos)
        print(f"Icon found at center position: {center_pos}")
    
    # 直接获取单个匹配项的中心点坐标
    center_pos = pyautogui.locateCenterOnScreen('button.png')
    if center_pos is not None:
        print(f"Button center found at: {center_pos}")
        pyautogui.click(center_pos)  # 点击按钮中心

    注意事项

    当使用 locateOnScreen 函数时,请注意以下几点:

    • 确保目标图像清晰且与屏幕截图中的图像完全一致,否则可能无法正确识别。
    • 高分辨率屏幕或大尺寸图像可能会导致查找过程较慢,考虑使用 region 参数缩小搜索范围。
    • 不同的显示设置(如缩放比例)可能会影响图像识别的效果,测试时应尽量保持环境一致。
    • 某些情况下,屏幕上的动态内容(如动画、闪烁的光标)可能导致图像识别不稳定。
    • 对于颜色敏感的应用场景,确保图像的颜色模式(如 RGB 或灰度)与屏幕内容相匹配。

    识别查找函数对于识别的质量要求非常高,就是一比一的要求,差一点都会导致识别失败,虽然可以通过参数confidence降低置信度,但很多时候,不是识别慢就是识别不上去,所以对一部分自动化流程,博主更推荐像素点检测来判断流程是否到了下一个阶段。

    像素点匹配

    pyautogui 库中的 pixelMatchesColor 函数用于检查屏幕上指定坐标的像素颜色是否与给定的颜色相匹配。这在自动化任务中非常有用,例如当您需要根据屏幕上的某个特定颜色来决定下一步操作时。该函数返回一个布尔值:如果颜色匹配则返回 True,否则返回 False。

    pixelMatchesColor 函数允许您验证屏幕上的某个点是否具有预期的颜色。以下是该函数的基本参数说明和使用示例:

    import pyautogui
    
    # 检查坐标 (100, 200) 处的像素颜色是否为红色 (RGB: 255, 0, 0)
    is_red = pyautogui.pixelMatchesColor(100, 200, (255, 0, 0))
    
    if is_red:
        print("The pixel at (100, 200) is red.")
    else:
        print("The pixel at (100, 200) is not red.")

    • xy:必须的参数,表示要检查的屏幕坐标。
    • expectedRGBColor:必须的参数,表示期望的颜色,格式为一个包含三个整数(红、绿、蓝)的元组,每个值的范围是 0 到 255。
    • tolerance(可选):定义颜色匹配的容差,默认值为 0。较高的容差意味着更宽松的颜色匹配,即允许实际颜色稍微偏离预期颜色。

    # 使用容差进行更灵活的颜色匹配
    is_close_to_red = pyautogui.pixelMatchesColor(100, 200, (255, 0, 0), tolerance=10)
    
    if is_close_to_red:
        print("The pixel at (100, 200) is close to red within the given tolerance.")
    else:
        print("The pixel at (100, 200) does not match the expected color within the tolerance.")

    除了基本的颜色匹配外,pixelMatchesColor 可以与其他 pyautogui 功能结合使用,以实现更加复杂的逻辑判断和自动化流程控制:

    # 在循环中等待直到某一点变为绿色 (RGB: 0, 255, 0)
    while not pyautogui.pixelMatchesColor(300, 400, (0, 255, 0)):
        pass  # 等待
    
    print("Pixel turned green!")

    或者可以编写更复杂的条件语句来响应不同的颜色变化:

    # 根据不同位置的颜色执行不同操作
    def check_colors_and_act():
        if pyautogui.pixelMatchesColor(100, 200, (255, 0, 0)):  # 如果 (100, 200) 是红色
            print("Red detected, performing action for red...")
            # 执行对应于红色的操作
        elif pyautogui.pixelMatchesColor(150, 250, (0, 255, 0)):  # 如果 (150, 250) 是绿色
            print("Green detected, performing action for green...")
            # 执行对应于绿色的操作
        else:
            print("No matching colors found.")
    
    check_colors_and_act()

    其他函数

    除了上述提到的函数以外,pyautogui的函数还有很多,例如:

    # 获取屏幕分辨率
    import pyautogui
    
    screen_width, screen_height = pyautogui.size()
    print(f"Screen resolution: {screen_width}x{screen_height}")

    上述代码将打印出当前屏幕的宽度和高度,这对于了解工作环境或调整自动化脚本中的坐标非常有用。

    # 获取当前鼠标的坐标
    import pyautogui
    
    current_mouse_x, current_mouse_y = pyautogui.position()
    print(f"Mouse position: ({current_mouse_x}, {current_mouse_y})")

    这段代码会输出鼠标当前位置的 X 和 Y 坐标,这在调试过程中特别有帮助,可以确保您的脚本点击了正确的地点。

    # 设置每个 PyAutoGUI 函数调用之间的暂停时间(全局变量)
    import pyautogui
    
    pyautogui.PAUSE = 1  # 每个函数调用后暂停 1 秒
    pyautogui.moveTo(100, 150)  # 移动鼠标到 (100, 150)
    pyautogui.click()  # 点击鼠标

    通过设置 PAUSE 变量,可以在每个 PyAutoGUI 函数执行完毕后自动暂停一段时间,从而让操作更加稳定和可预测。

    # 获取具有指定标题的所有窗口对象
    from pyautogui import getWindowsWithTitle
    
    notepad_windows = getWindowsWithTitle('无标题 - 记事本')  # 替换为实际窗口标题
    if notepad_windows:
        print("Found Notepad windows:", len(notepad_windows))
    else:
        print("No Notepad windows found.")

    getWindowsWithTitle 函数用于查找并返回所有匹配给定标题的窗口对象列表。这对于管理和操作特定应用程序窗口非常有用。

    # 获取当前活动窗口
    from pyautogui import getActiveWindow
    
    active_window = getActiveWindow()
    if active_window:
        print("Active window title:", active_window.title)

    getActiveWindow 函数返回当前用户正在交互的窗口对象,您可以从中获取更多信息或执行窗口特定的操作。

    # 获取窗口的几何信息
    from pyautogui import getWindowGeometry
    
    window_title = "无标题 - 记事本"  # 替换为实际窗口标题
    geometry = getWindowGeometry(window_title)
    if geometry:
        print("Window geometry:", geometry)

    使用 getWindowGeometry 函数可以获取指定窗口的位置、大小等信息,这对于需要精确控制窗口位置或尺寸的应用场景很有帮助。

    import pyautogui
    pyautogui.mouseInfo()

    鼠标信息函数,会生成一个信息框,上面实时显示鼠标的信息:

    鼠标信息框

    结尾

    pyautogui的脚本编写和之前的keymousego我认为没有什么区别,但是pyautogui可以实现的更多,理论上,它已经能满足你对脚本的所有幻想…

    哦!?等等,并没有解决你的所有问题?看来我的朋友的业务场景又开始复杂了。pyautogui解决了keymousego无法设置条件判断,无法局部循环,无法设置变量等等诸多问题,已经不是一个简单的脚本库了,学完了pyautogui,你的两只脚就已经彻底上了编程的大船,你可以高呼!大计科号令天下,谁与争锋。

    当然还有没有解决的问题,我的数据如何导入脚本?不可能靠输入提示框一个个输入?浏览器如何操作?靠pyautogui一下下点么?脚本过程中的数据如何交互?保存、运算等等…(这里实际上我是再给我自己为后续的文章铺垫)

    恭喜你我的朋友,你已经看到了这里,我由衷的希望你在人生的道路上像编程一样,一关关的闯下去势不可挡!

    敬请期待下一关!数据读取、导入pandas入门!

文末声明:

您必须遵守关于,您可以随意转发/引用,但要注明原作者Leon或设置本文跳转连接,并且您必须在文中包含或提醒浏览者遵守作者声明
欢迎关注公众号获取第二手文章!高效工作法

暂无评论

发送评论 编辑评论


				
上一篇
下一篇