相位猛冲 发表于 2024-1-21 13:30

python找图片并用鼠标点击

用python编写自动化脚本的时候
大部分的业务逻辑都是在用【鼠标点击指定坐标和图片】
1.鼠标指定坐标点击Python 模拟用户操作鼠标
2.找到图片点击图片

如果你不知道窗口句柄,可以用我下面的代码,只要输入目标的窗口名字就行
例如:
1.你打开了【QQ游戏】窗口,直接用句柄_模糊取标题(“QQ游戏”)
2.你打开了【QQ游戏 - fdsfxcqwesfdsxvcx】窗口,也直接用句柄_模糊取标题(“QQ游戏”)
源码放在下面了
import re,win32gui

def 句柄_模糊取标题(模糊标题名):
    ' 匹配多个:返回数组;反之:返回1个\n\n返回-1没有找到'
    窗口句柄_list = []

    # 编译正则表达式模式
    pattern = re.compile(模糊标题名, re.I)# re.I 表示不区分大小写

    # 遍历所有窗口,找到匹配的标题
    def callback(窗口句柄, 窗口句柄_list):
      if win32gui.IsWindowVisible(窗口句柄):
            window_text = win32gui.GetWindowText(窗口句柄)
            if re.search(pattern, window_text):
                窗口句柄_list.append(窗口句柄)
      return True

    # 枚举窗口并执行回调函数
    win32gui.EnumWindows(callback, 窗口句柄_list)
    if len(窗口句柄_list) == 1:
      return 窗口句柄_list
    elif len(窗口句柄_list) > 1:
      return 窗口句柄_list
    else:
      return -1

查找图片并点击的python源码如下:
import pyautogui,os,win32gui

图片_找图并点击('1.png')

def 图片_找图并点击(image_path, 窗口句柄=None, click_type=1, s=None):
    """识别图像并根据提供的参数执行单击或双击。"""

    if not os.path.exists(image_path):
      print("图片路径错误:不存在这个图片!")
      return

    # 记录当前鼠标位置,稍后将鼠标恢复到此位置
    original_x, original_y = pyautogui.position()

    try:
      # 激活窗口
      if 窗口句柄:
         win32gui.SetForegroundWindow(窗口句柄)# 设置窗口到前台

      # 区分窗口句柄是否存在,决定如何进行屏幕捕获
      if 窗口句柄:
            # 获取窗口的屏幕坐标
            left, top, right, bottom = win32gui.GetWindowRect(窗口句柄)
            window_screenshot = ImageGrab.grab(bbox=(left, top, right, bottom))
            # 在窗口截图中寻找匹配图像
            position = pyautogui.locate(image_path, window_screenshot, confidence=0.8)
      else:
            # 在整个屏幕中寻找匹配图像
            position = pyautogui.locateOnScreen(image_path, confidence=0.8)

      if position is None:
            print("图片未找到!")
            return

      # 计算图像中心点
      center_x, center_y = position.left + position.width // 2, position.top + position.height // 2
      if 窗口句柄:
            # 将坐标调整到全屏幕坐标
            center_x += left
            center_y += top

      pyautogui.moveTo(center_x, center_y)# 移动鼠标到图像中心

      if s:# 如果有延迟参数,先延时
            time.sleep(s)

      # 根据click_type参数,执行单击或双击
      if click_type == 2:
            pyautogui.doubleClick()
      else:
            pyautogui.click()

    except Exception as e:
      print("图片挡住了:", e)

    finally:
      pyautogui.moveTo(original_x, original_y)# 操作后将鼠标还原到原位


快去试试把{:1_918:}

hqt 发表于 2024-1-21 22:44

wc 中文def… 理论上def 打印(arg:str):
print(arg)是不是能把整个Python改成中文{:301_985:}我想整活了

相位猛冲 发表于 2024-1-22 17:56

helian147 发表于 2024-1-22 13:04
试了试,pyautogui找图片效果不稳定,不改代码的前提下,有时找得到有时找不到图片报错

图片在电脑屏幕里,没有遮挡的话,应该是可以的

图片有可能会受电脑背景影响,把图片截小一点试试

例外我用的python3.12 win10

郑前勇 发表于 2024-1-21 15:00

相位猛冲 发表于 2024-1-21 15:16

郑前勇 发表于 2024-1-21 15:00
要是来个成品就更好了

拿我的源码直接编译exe就可以了

郑前勇 发表于 2024-1-21 15:20

sai609 发表于 2024-1-21 15:54

以图搜索的python逻辑在哪里

新颖轻 发表于 2024-1-21 16:40

怎么感觉是个易语言写法

urdarling 发表于 2024-1-21 18:57

这个做自动化测试方便

xingwenzhiyuan 发表于 2024-1-21 19:50

这个代码,很厉害的说,学习一下

Pwaerm 发表于 2024-1-21 20:51

好的学习资料,谢谢分享。但是中文变量名有点不习惯
页: [1] 2
查看完整版本: python找图片并用鼠标点击