用Python和Tkinter打造一个“截图+模板匹配”小工具

使用Tkinter和PIL构建一个模板匹配录入工具

在自动化测试或图像处理任务中,模板匹配是一个常见的需求。
为了简化这一过程,我决定构建一个基于Tkinter和PIL(Python Imaging Library)的图形用户界面(GUI)工具,用于快速录入和管理模板图像。
本文将介绍这个工具的设计思路和实现细节。

工具功能概述

这个工具的主要功能包括:

  1. 截图功能:通过ADB(Android Debug Bridge)从连接的设备上获取屏幕截图。
  2. 图像裁剪:用户可以在截图上框选感兴趣的区域,并将其保存为模板图像。
  3. 模板管理:保存的模板图像会被自动命名并存储在指定目录中,用户可以在工具中查看、删除或验证这些模板。
  4. 代码生成:工具可以生成用于自动化脚本的代码片段,方便用户快速集成到项目中。

26171513wyu4pbg3vj1737882905662.png

工具设计思路

1. 界面布局

工具的主界面分为左右两部分:

  • 左侧:显示当前设备的屏幕截图,用户可以在截图上框选感兴趣的区域。
  • 右侧:显示框选区域的预览图,并提供输入框和按钮用于保存、管理和验证模板。

2. 截图与裁剪

截图功能通过ADB命令实现,用户点击“更新截图”按钮时,工具会从设备上获取最新的屏幕截图并显示在左侧的画布上。
用户可以通过鼠标在截图上框选感兴趣的区域,工具会自动计算框选区域的坐标,并将其裁剪为模板图像。

3. 模板管理

保存的模板图像会通过GPT自动命名并存储在指定目录中。工具会记录每个模板的名称、变量名、文件路径等信息,并在右侧的列表中显示。
用户可以通过列表中的按钮复制代码、删除模板或验证模板。

4. 代码生成与验证

工具可以生成用于自动化脚本的代码片段,用户可以通过点击“复制代码”按钮将代码复制到剪贴板。
此外,工具还提供了“验证”功能,用户可以通过点击“验证”按钮来检查当前模板是否能在最新的截图中匹配到。

实现细节

1. 截图功能

截图功能通过调用ADB命令实现:

1
2
3
4
5
def screenshot():
screenshot_file = os.path.join(SCREENSHOTS_DIR, 'screenshot.png')
subprocess.run(["adb", "shell", "screencap", "-p", "/sdcard/screenshot.png"])
subprocess.run(["adb", "pull", "/sdcard/screenshot.png", screenshot_file])
return screenshot_file

2. 图像裁剪与预览

用户框选区域后,工具会根据框选的坐标裁剪原始图像,并将裁剪后的图像显示在右侧的预览框中:

1
2
3
4
5
6
7
def on_button_release(self, event):
# 裁剪图像并显示在预览框中
if self.image:
self.cropped_image = self.image.crop(self.get_original_box())
preview_image = self.cropped_image.resize((self.preview_width, self.preview_height), Image.Resampling.LANCZOS)
self.tk_preview_image = ImageTk.PhotoImage(preview_image)
self.preview_image_label.config(image=self.tk_preview_image)

3. 模板保存与管理

保存模板时,工具会根据用户输入的元素名生成变量名,并将裁剪后的图像保存到指定目录中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def save_cropped_image(self):
element_name = self.element_name_input.get()
if not element_name.strip():
messagebox.showwarning("提示", "元素名不能为空!")
return

element_variable_name = generate_variable_name(element_name)
element_file_name = f"{datetime.now().strftime('%H%M%S')}_{element_variable_name}.png"
abs_element_file = os.path.join(INPUT_PATH, 'element_image', datetime.now().strftime('%Y/%m'), element_file_name)
os.makedirs(os.path.dirname(abs_element_file), exist_ok=True)
self.cropped_image.save(abs_element_file)

element_info = ImageElementInfo(name=element_name, element_variable_name=element_variable_name,
file_name=element_file_name, rel_element_file=rel_element_file,
abs_element_file=abs_element_file, image=self.cropped_image)
self.element_list.append(element_info)
self.update_list()

4. 代码生成与验证

工具可以生成用于自动化脚本的代码片段,或者直接调用模板匹配方法验证模板的有效性:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def copy_element_code(self, index):
item = self.element_list[index]
element_code_str = f'{item.element_variable_name} = click_image(Image.open("{item.abs_element_file}"))'
root.clipboard_clear()
root.clipboard_append(element_code_str)

def verify_element(self, index):
item = self.element_list[index]
image_result_path = template_matching(screenshot(), item.abs_element_file)[1]
if image_result_path is None:
messagebox.showwarning("提示", "未匹配到元素")
return
self.image = Image.open(image_result_path)
self.update_canvas()

总结

这个工具通过简单的GUI界面,帮助用户快速录入和管理模板图像,并生成自动化脚本所需的代码片段。
通过ADB和PIL的结合,工具能够高效地处理截图和图像裁剪任务。

源码地址:GitHub仓库链接

希望这个工具能帮助你在自动化测试或图像处理任务中提高效率!。


用Python和Tkinter打造一个“截图+模板匹配”小工具
https://www.jalonjia.com/2025/python/image-template-tool/
作者
JalonJia
发布于
2025年1月25日
许可协议