如何使用 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 检测图像并单击它? 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • 是否有解决方法可以通过 CoinGecko API 安全检查?

    我在工作中运行我的代码 一切都很顺利 但在不同的网络 家庭 WiFi 上 我不断收到403访问时出错CoinGecko V3 API https www coingecko com api documentations v3 可以观察到 在
  • 如何手动计算分类交叉熵?

    当我手动计算二元交叉熵时 我应用 sigmoid 来获取概率 然后使用交叉熵公式并平均结果 logits tf constant 1 1 0 1 2 labels tf constant 0 0 1 1 1 probs tf nn sigm
  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • Django 的内联管理:一个“预填充”字段

    我正在开发我的第一个 Django 项目 我希望用户能够在管理中创建自定义表单 并向其中添加字段当他或她需要它们时 为此 我在我的项目中添加了一个可重用的应用程序 可在 github 上找到 https github com stephen
  • Python 中的哈希映射

    我想用Python实现HashMap 我想请求用户输入 根据他的输入 我从 HashMap 中检索一些信息 如果用户输入HashMap的某个键 我想检索相应的值 如何在 Python 中实现此功能 HashMap
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 使用 Python 从文本中删除非英语单词

    我正在 python 上进行数据清理练习 我正在清理的文本包含我想删除的意大利语单词 我一直在网上搜索是否可以使用像 nltk 这样的工具包在 Python 上执行此操作 例如给出一些文本 Io andiamo to the beach w
  • 跟踪 pypi 依赖项 - 谁在使用我的包

    无论如何 是否可以通过 pip 或 PyPi 来识别哪些项目 在 Pypi 上发布 可能正在使用我的包 也在 PyPi 上发布 我想确定每个包的用户群以及可能尝试积极与他们互动 预先感谢您的任何答案 即使我想做的事情是不可能的 这实际上是不
  • 将 python2.7 与 Emacs 24.3 和 python-mode.el 一起使用

    我是 Emacs 新手 我正在尝试设置我的 python 环境 到目前为止 我已经了解到在 python 缓冲区中使用 python mode el C c C c将当前缓冲区的内容加载到交互式 python shell 中 显然使用了什么
  • 如何使用 Pandas、Numpy 加速 Python 中的嵌套 for 循环逻辑?

    我想检查一下表的字段是否TestProject包含了Client端传入的参数 嵌套for循环很丑陋 有什么高效简单的方法来实现吗 非常感谢您的任何建议 def test parameter a list parameter b list g
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • 使用 xlrd 打开 BytesIO (xlsx)

    我正在使用 Django 需要读取上传的 xlsx 文件的工作表和单元格 使用 xlrd 应该可以 但因为文件必须保留在内存中并且可能不会保存到我不知道如何继续的位置 本例中的起点是一个带有上传输入和提交按钮的网页 提交后 文件被捕获req
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何使用python在一个文件中写入多行

    如果我知道要写多少行 我就知道如何将多行写入一个文件 但是 当我想写多行时 问题就出现了 但是 我不知道它们会是多少 我正在开发一个应用程序 它从网站上抓取并将结果的链接存储在文本文件中 但是 我们不知道它会回复多少行 我的代码现在如下 r
  • Jupyter Notebook 找不到 Python 模块

    不知道发生了什么 但每当我使用 ipython 氢 原子 或 jupyter 笔记本时都找不到任何已安装的模块 我知道我安装了 pandas 但笔记本说找不到 我应该补充一点 当我正常运行脚本时 python script py 它确实导入
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 使用随机放置的 NaN 创建示例 numpy 数组

    出于测试目的 我想创建一个M by Nnumpy 数组与c随机放置的 NaN import numpy as np M 10 N 5 c 15 A np random randn M N A mask np nan 我在创建时遇到问题mas

随机推荐

  • 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