使用Tkinter和PIL构建一个模板匹配录入工具
在自动化测试或图像处理任务中,模板匹配是一个常见的需求。
为了简化这一过程,我决定构建一个基于Tkinter和PIL(Python Imaging Library)的图形用户界面(GUI)工具,用于快速录入和管理模板图像。
本文将介绍这个工具的设计思路和实现细节。
工具功能概述
这个工具的主要功能包括:
- 截图功能:通过ADB(Android Debug Bridge)从连接的设备上获取屏幕截图。
- 图像裁剪:用户可以在截图上框选感兴趣的区域,并将其保存为模板图像。
- 模板管理:保存的模板图像会被自动命名并存储在指定目录中,用户可以在工具中查看、删除或验证这些模板。
- 代码生成:工具可以生成用于自动化脚本的代码片段,方便用户快速集成到项目中。

工具设计思路
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仓库链接
希望这个工具能帮助你在自动化测试或图像处理任务中提高效率!。