如何使用 pyautogui 检测图像并单击它?

2023-12-15

我想学习如何让机器人点击图像,我尝试观看 yt 教程,但我找不到代码中的错误,因为这实际上是我第一次使用 python,我尝试了以下代码:

from pyautogui import *
import pyautogui
import time
import keyboard
import random
import win32api, win32con

time.sleep(5)

def click():
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)

while keyboard.is_pressed('q') == False:
    flag = 0
    
    if pyautogui.locateOnScreen('benz.png', region=(0,0,1366,768), grayscale=True, confidence=0.5) != None:
                flag = 1
                click()
                time.sleep(0.05)
                break

                
                if flag == 1:
                 break

但我不断得到:

Traceback (most recent call last):
  File "c:\Program Files\Karim\autoclicker\main+stickman.py", line 17, in <module>
    if pyautogui.locateOnScreen('benz.png', region=(0,0,1366,768), grayscale=True, confidence=0.5) != None:
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyautogui\__init__.py", line 175, in wrapper
    return wrappedFunction(*args, **kwargs)
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyautogui\__init__.py", line 213, in locateOnScreen
    return pyscreeze.locateOnScreen(*args, **kwargs)
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyscreeze\__init__.py", line 373, in locateOnScreen
    retVal = locate(image, screenshotIm, **kwargs)
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyscreeze\__init__.py", line 353, in locate
    points = tuple(locateAll(needleImage, haystackImage, **kwargs))
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyscreeze\__init__.py", line 207, in _locateAll_opencv
    needleImage = _load_cv2(needleImage, grayscale)
  File "C:\Users\bayan\AppData\Local\Programs\Python\Python310\lib\site-packages\pyscreeze\__init__.py", line 170, in _load_cv2
    raise IOError("Failed to read %s because file is missing, "
OSError: Failed to read benz.png because file is missing, has improper permissions, or is an unsupported or invalid format

注:benz.png文件与代码位于同一文件夹中,它是 png 格式,实际上是一张照片(意味着当您双击它时它会打开并显示照片)

代码中可能有一个我不知道的愚蠢错误,因为我对 python 几乎一无所知 ????


PyAutoGUI 有一个内置的function called locateOnScreen()如果可以在当前屏幕上找到图像,则返回图像中心的 x、y 坐标(它会截取屏幕截图,然后对其进行分析)。

图像必须匹配exactly为了这个工作;即如果您想单击button.png该按钮图片必须与窗口中的按钮具有相同的精确尺寸/分辨率,以便程序识别它。实现此目的的一种方法是截取屏幕截图,在绘图中将其打开,然后仅剪切出您想要按下的按钮(或者您可以让 PyAutoGUI 为您完成此操作,正如我将在后面的示例中展示的那样)。

import pyautogui

question_list = ['greencircle', 'redcircle', 'bluesquare', 'redtriangle']

user_input = input('Where should I click? ')

while user_input not in question_list:
    print('Incorrect input, available options: greencircle, redcircle, bluesquare, redtriangle')
    user_input = input('Where should I click?')

location = pyautogui.locateOnScreen(user_input + '.png')
pyautogui.click(location)

上面的例子要求你已经有greencircle.png以及目录中的所有其他 .png

PyAutoGUI 还可以截图并且您可以指定在屏幕的哪个区域进行拍摄pyautogui.screenshot(region=(0, 0, 0, 0))前两个值是要选择的区域左上角的 x,y 坐标,第三个值是向右的距离 (x),第四个值是向下的距离 (y)。

以下示例截取 Windows 10 徽标的屏幕截图,将其保存到文件中,然后使用指定的 .png 文件单击该徽标

import pyautogui

pyautogui.screenshot('win10_logo.png', region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen('win10_logo.png')
pyautogui.click(location)

您也不必将屏幕截图保存到文件中,只需将其保存为变量即可

import pyautogui

win10 = pyautogui.screenshot(region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen(win10)
pyautogui.click(location)

让程序检测用户是否单击了某个区域(比方说,Windows 10 徽标)将需要另一个库,例如pynput.

from pynput.mouse import Listener    

def on_click(x, y, button, pressed):
    if 0 < x < 50 and 1080 > y > 1041 and str(button) == 'Button.left' and pressed:
        print('You clicked on Windows 10 Logo')
        return False    # get rid of return statement if you want a continuous loop

with Listener(on_click=on_click) as listener:
    listener.join()

将所有内容放在一起

import pyautogui
from pynput.mouse import Listener

win10 = pyautogui.screenshot(region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen(win10)

# location[0] is the top left x coord
# location[1] is the top left y coord
# location[2] is the distance from left x coord to right x coord
# location[3] is the distance from top y coord to bottom y coord

x_boundary_left = location[0]
y_boundary_top = location[1]
x_boundary_right = location[0] + location[2]
y_boundary_bottom = location[1] + location[3]


def on_click(x, y, button, pressed):
    if x_boundary_left < x < x_boundary_right and y_boundary_bottom > y > y_boundary_top and str(button) == 'Button.left' and pressed:
        print('You clicked on Windows 10 Logo')
        return False    # get rid of return statement if you want a continuous loop


with Listener(on_click=on_click) as listener:
    listener.join()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 pyautogui 检测图像并单击它? 的相关文章

随机推荐

  • QRunnable 尝试中止任务

    是否可以中止 QRunnable 任务 即使在文档中我也找不到任何方法 多谢 不 您不能中止 QRunnable 任务 在 Qt 中脏中止线程的唯一方法是通过QThread terminate 这是不鼓励的 QThreadPool uses
  • 制作一个函数在返回之前等待事件?

    function myFunction wait what I put there return myFunction this is an event when its triggered I want function to resum
  • 如何使用python从内网站点抓取URL数据?

    我需要一个 Python Warrior 来帮助我 我是个菜鸟 我正在尝试使用模块 urllib 从内部网站点抓取某些数据 但是 由于这是我公司的网站 仅供员工查看 而不可供公众查看 我认为这就是我得到此代码的原因 IOError http
  • WPF 绑定到样式中另一个属性的绑定

    我不确定提出这个问题的最佳方式 抱歉问题标题含糊不清 但本质上我想使用从数据上下文传递属性的值转换器在 TextBox 上设置 MaxLength 属性 以及传入属性上的属性作为转换器参数 我想以一种风格来完成这一切 而不是在逐个控制的基础
  • 在撰写中获取可见性画布绘制

    我有一个画布 可以在其中绘制两个相同大小的图像 并且我已经实现了一个触摸侦听器 可以在其中 擦除 其中一个图像 我想知道是否有可能知道该图像的可见性百分比我正在 擦除 val overlayImageLoaded rememberAsync
  • 如何在phonegap中播放swf文件?

    我正在 android 的phonegap 中开发一个Flash 应用程序 我尝试过将 flash 嵌入到 html 中 但没有成功 它显示空白 什么也没有出现 然后我尝试使用 childBrowser childbrowser 打开 但仍
  • 在使用 Jersey 使用 jaxb 注释将 json 解组到 java bean 时如何使用一些间接寻址

    我正在尝试解组一些收到的 json 来自 Jira Restful Web 服务 问题是 问题 具有 摘要 属性和字段列表 摘要不作为接收到的 json 中的属性出现 而是作为 fields 属性的值出现 我坚持解组到这个结构 XmlRoo
  • 如何从一个类中调用另一个类中的函数?

    更新 修改标题以更好地反映我的问题 大家好 我今天的问题围绕着我试图从一个子类发送到另一个子类的 CustomEvent 我已经使用我的 CustomEvent 类将事件从子类传递到我的主类 但我不确定由谁在子类之间执行此操作 我的自定义事
  • 将日期转换为时间戳 UTC

    我是 Java 新手 想知道如何将日期转换为时间戳 如果我向它传递一个日期 反之亦然 我在 StackOverflow 上搜索过 但没有一个问题能解决我的问题 我需要在 JSON 中使用此时间戳作为 highcharts API 上的参数来
  • sql中如何求中位数

    我有以下 sql 查询 它给出了按月 周和日分组的总 h time 相反 我想要月 周和日的 h time 中位数 如何在 Oracle SQL 中执行此操作 SELECT DAY MEDIAN H TIME AS HANDLE TIME
  • 创建一个函子作为可调用类或嵌套函数[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 Python 3 中你可以创建这样的类 class foo def init self x self x x def call self y self x self x 1 retur
  • 如何确保MySQL数据库在增加字段时不存在竞争条件?

    当两个连接想要更新同一条记录时 如何防止 MySQL 数据库中的竞争条件 例如 连接 1 想要增加 尝试 计数器 第二个连接也想做同样的事情 两个连接SELECT 尝试 计数 增加值 两者UPDATE 尝试 增加的值 突然间 tries 只
  • 为什么 XPath 选择上下文节点之外的节点?

    我将 XPath 与 Node js 结合使用 并且有以下 HTML 文档 我想在其中选择所有文章节点 然后在第二步中选择所有带有类的 div abc
  • Javascript/XML - 获取节点名称

    我需要获取标签 myChild 的名称和 内容 这很简单 但我被困住了 困了 这是我通过测试得到的结果 XML
  • 如何强制章节在 ODD 页面(html 和 epub)上开始

    Chapter padding bottom 30vh break before right important 好消息 章节从自己的页面开始 坏消息 预期的行为 在主框之前强制一两个分页符 哪个将使下一页成为正确的页面 被浏览器和任何 e
  • 在 Android 中跨活动播放 BG 音乐

    你好 第一次在 stackoverflow 上提问 令人兴奋 哈哈 我们正在开发一个 Android 游戏 我们为我们的介绍播放一些背景音乐 我们有一个介绍活动 但我们希望它继续播放到下一个活动 并且也许能够从游戏内的任何地方停止或再次播放
  • pip install mysql-python 失败并出现环境错误:找不到 mysql_config

    这是我得到的错误 mysite zjm1126 zjm1126 G41MT S2 zjm test mysite pip install mysql python Downloading unpacking mysql python Dow
  • 在 JAVA 中获取给定日期范围(DateX 和 DateY)之间的所有星期一和星期四日期将是一个很好的实现

    我想在给定的日期范围内获取一些天数 对此的最佳解决方案是什么 例如 我想获取从今天到两个月的所有星期一 星期三和星期四的日期 使用java time 现代方法使用 java time 类 实例化List对象来收集您的结果 List
  • 不同分辨率下的 Windows 窗体大小问题

    我是窗口表单开发的新手 在开发了一些表单后 我注意到表单在不同的分辨率下无法正确显示 表单在某些分辨率下超出了屏幕 我想知道是否有任何设置可以根据分辨率自动调整表单 或者是否有任何黑客或一些技术可以用来设计表单 请详细说明您的答案 因为我对
  • 如何使用 pyautogui 检测图像并单击它?

    我想学习如何让机器人点击图像 我尝试观看 yt 教程 但我找不到代码中的错误 因为这实际上是我第一次使用 python 我尝试了以下代码 from pyautogui import import pyautogui import time