python pyautogui实现图片识别点击失败后重试

安装库

pip install Pillow
pip install opencv-python

confidence作用

confidence 参数是用于指定图像匹配的信度(或置信度)的,它表示图像匹配的准确程度。这个参数的值在 0 到 1 之间,数值越高表示匹配的要求越严格。

具体来说,confidence 参数用于调整在屏幕上搜索目标图像时的匹配精度:

0.0 表示完全不匹配。

1.0 表示完全匹配。

在实际应用中,图像匹配的信度可以帮助你处理一些图像上的细微差异。例如,屏幕上的图像可能因为分辨率、光线、颜色等原因与原始图像有些不同。通过调整 confidence 参数,你可以设置一个合理的阈值,使得图像匹配过程既不太严格(导致找不到图像),也不太宽松(导致误匹配)。

举个例子,如果你设置 confidence=0.8,那么只有当屏幕上的图像与目标图像的相似度达到 80% 以上时,才会被认为是匹配的。

识别图片点击

import pyautogui
import time
import os


def locate_and_click_image(image_path, retry_interval=2, max_retries=5, click_count=1, confidence=None):
    """
    定位图片并点击指定次数。

    :param image_path: 图片路径
    :param retry_interval: 重试间隔时间(秒)
    :param max_retries: 最大重试次数
    :param click_count: 点击次数
    :param confidence: 图像匹配的信度(0到1之间),需要安装 OpenCV
    :return: 图片的位置 (x, y, width, height) 或 None(如果未找到)
    """
    if not os.path.isfile(image_path):
        print(f"错误:图片路径无效或文件不存在: {image_path}")
        return None

    retries = 0
    while retries < max_retries:
        try:
            if confidence is not None:
                location = pyautogui.locateOnScreen(image_path, confidence=confidence)
            else:
                location = pyautogui.locateOnScreen(image_path)

            if location is not None:
                print(f"找到图片: {image_path},位置: {location}")
                center = pyautogui.center(location)
                for _ in range(click_count):
                    pyautogui.click(center)
                    print(f"点击图片中心位置。点击次数:{_ + 1}")
                return location
            else:
                print(f"未找到图片: {image_path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
                time.sleep(retry_interval)
                retries += 1
        except pyautogui.ImageNotFoundException:
            print(f"未找到图片: {image_path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
            time.sleep(retry_interval)
            retries += 1

    print(f"达到最大重试次数: {max_retries},未找到图片: {image_path}")
    return None


def main():
    image_path = '1.png'  # 替换为你的图片路径
    retry_interval = 2
    max_retries = 5
    click_count = 1
    confidence = 0.8  # 如果不使用 OpenCV,请将此参数设置为 None

    location = locate_and_click_image(image_path, retry_interval, max_retries, click_count, confidence)
    if location:
        print("操作完成。")
    else:
        print("未能定位到图片,程序结束。")


if __name__ == "__main__":
    locate_and_click_image('1.png', retry_interval=2, max_retries=5, click_count=2, confidence=0.8)

优化代码,识别多张图片并点击

import pyautogui
import time
import os

def locate_and_click_image(path, retry_interval=2, max_retries=5, click_count=1, confidence=None):
    if not os.path.isfile(path):
        print(f"错误:图片路径无效或文件不存在: {path}")
        return None

    retries = 0
    while retries < max_retries:
        try:
            if confidence is not None:
                location = pyautogui.locateOnScreen(path, confidence=confidence)
            else:
                location = pyautogui.locateOnScreen(path)

            if location is not None:
                print(f"找到图片: {path},位置: {location}")
                center = pyautogui.center(location)
                for _ in range(click_count):
                    pyautogui.click(center)
                    print(f"点击图片中心位置。点击次数:{_ + 1}")
                return location
            else:
                print(f"未找到图片: {path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
                time.sleep(retry_interval)
                retries += 1
        except pyautogui.ImageNotFoundException:
            print(f"未找到图片: {path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
            time.sleep(retry_interval)
            retries += 1

    print(f"达到最大重试次数: {max_retries},未找到图片: {path}")
    return None

def main():
    images = [
        {'path': '1.png', 'retry_interval': 2, 'max_retries': 5, 'click_count': 1, 'confidence': 0.8},
        {'path': '3.png', 'retry_interval': 2, 'max_retries': 5, 'click_count': 1, 'confidence': 0.8},
        # 添加更多图片
    ]

    for image in images:
        location = locate_and_click_image(**image)
        if location:
            print(f"图片 {image['path']} 操作完成。")
        else:
            print(f"未能定位到图片 {image['path']},程序结束。")

if __name__ == "__main__":
    main()

优化代码,识别多张图片,只要识别到图片就结束循环

import pyautogui
import time
import os

def locate_and_click_image(path, retry_interval=2, max_retries=5, click_count=1, confidence=None):
    if not os.path.isfile(path):
        print(f"错误:图片路径无效或文件不存在: {path}")
        return None

    retries = 0
    while retries < max_retries:
        try:
            if confidence is not None:
                location = pyautogui.locateOnScreen(path, confidence=confidence)
            else:
                location = pyautogui.locateOnScreen(path)

            if location is not None:
                print(f"找到图片: {path},位置: {location}")
                center = pyautogui.center(location)
                for _ in range(click_count):
                    pyautogui.click(center)
                    print(f"点击图片中心位置。点击次数:{_ + 1}")
                return True
            else:
                print(f"未找到图片: {path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
                time.sleep(retry_interval)
                retries += 1
        except pyautogui.ImageNotFoundException:
            print(f"未找到图片: {path},{retry_interval}秒后重试...(重试次数: {retries + 1}/{max_retries})")
            time.sleep(retry_interval)
            retries += 1

    print(f"达到最大重试次数: {max_retries},未找到图片: {path}")
    return False

def main():
    images = [
        {'path': '1.png', 'retry_interval': 2, 'max_retries': 5, 'click_count': 1, 'confidence': 0.8},
        {'path': '3.png', 'retry_interval': 2, 'max_retries': 5, 'click_count': 1, 'confidence': 0.8},
        {'path': '4.png', 'retry_interval': 2, 'max_retries': 5, 'click_count': 1, 'confidence': 0.8},
        # 添加更多图片
    ]

    for image in images:
        success = locate_and_click_image(**image)
        if success:
            print(f"图片 {image['path']} 操作完成。")
            break
        else:
            print(f"未能定位到图片 {image['path']}。")

if __name__ == "__main__":
    main()

如有帮助,请多多支持作者! 你鼓励是我最大的动力~QAQ~

相关推荐
镜花照无眠1 小时前
python破解字母已知但大小写未知密码
开发语言·python
程序无涯海1 小时前
Python爬虫教程第1篇-基础知识
开发语言·爬虫·python·网络爬虫
家有狸花1 小时前
PYTHON自学笔记(一)vscode配置
笔记·vscode·python
鸽芷咕1 小时前
【python学习】快速了解python基本数据类型
开发语言·python·学习
秋刀鱼_(:з」∠)_别急1 小时前
如何获取歌曲id---cloudmusic
后端·爬虫·python·计算机网络·ajax·okhttp·xhr
杰哥在此2 小时前
Python面试题:如何在 Python 中读取和写入 JSON 文件?
开发语言·python·面试·json·编程
我是陈泽2 小时前
AI教你如何系统的学习Python
开发语言·数据结构·人工智能·python·学习·青少年编程
落798.2 小时前
【植物大战僵尸杂交版】获取+存档插件
python·游戏·github
yukai080082 小时前
Python 全栈系列258 线程并发与协程并发
python·microsoft·性能优化
alim20123 小时前
python语句性能分析
开发语言·python