如何让Python等待Max Marking软件的“蚀刻中”提示,完成后自动关闭程序
实现方案
你可以通过以下两种常用方案检测应用内的提示状态,替代固定时长等待:
方案1:图像特征匹配(开发成本最低)
直接通过PyAutoGUI的图像识别能力判断提示是否存在,步骤如下:
- 启动Max Marking进入蚀刻状态时,单独截取“正在蚀刻”提示的核心区域(只保留文字部分,避免多余背景干扰识别),保存为
etching_tag.png放在代码同目录 - 用循环持续检测该图像是否在屏幕上出现,消失后再执行后续关闭操作
修改后的代码示例:
import os import time import pyautogui def engrave_task(): os.startfile('....filepath....') time.sleep(2) pyautogui.press('f2') # 等待蚀刻提示出现(避免还没弹出就开始检测) time.sleep(1) # 循环检测蚀刻状态,加300秒超时兜底避免无限等待 wait_start = time.time() while time.time() - wait_start < 300: # 检测提示是否存在,confidence参数适配轻微显示差异,需要安装opencv-python支持 if pyautogui.locateOnScreen('etching_tag.png', confidence=0.8) is None: # 提示消失,雕刻完成 break time.sleep(1) os.system('taskkill /f /im maxmarking.exe')
注:使用confidence参数需要先安装依赖:pip install opencv-python
方案2:窗口文本遍历(稳定性更高)
如果“正在蚀刻”是标准Windows控件文本,可以通过pywin32库遍历软件窗口的控件文本,无需截图适配,不受窗口位置、分辨率影响:
- 先安装依赖:
pip install pywin32 - 代码示例:
import os import time import win32gui import win32con def get_window_text(hwnd): length = win32gui.SendMessage(hwnd, win32con.WM_GETTEXTLENGTH) + 1 buf = win32gui.PyMakeBuffer(length) win32gui.SendMessage(hwnd, win32con.WM_GETTEXT, length, buf) return buf[:length-1].decode('gbk') def check_etching_status(): # 遍历所有窗口查找是否存在含“蚀刻”关键词的控件 def callback(hwnd, res): if "maxmarking" in win32gui.GetClassName(hwnd).lower() or "Max Marking" in win32gui.GetWindowText(hwnd): text = get_window_text(hwnd) if "蚀刻" in text or "正在蚀刻" in text: res.append(True) res = [] win32gui.EnumWindows(callback, res) return len(res) > 0 def engrave_task(): os.startfile('....filepath....') time.sleep(2) pyautogui.press('f2') time.sleep(1) wait_start = time.time() while time.time() - wait_start < 300: if not check_etching_status(): break time.sleep(1) os.system('taskkill /f /im maxmarking.exe')
额外优化建议
- 如果你可以拿到Max Marking的日志文件或者运行状态接口,优先读取日志判断状态,可靠性最高
- 两种方案都加了超时兜底逻辑,避免软件报错卡死导致程序一直等待
内容的提问来源于stack exchange,提问作者Mitch McDonald
相关产品推荐
相关产品推荐

