From 90d7d8e3f089c70f6a580d3ef3e448dd740e3b97 Mon Sep 17 00:00:00 2001 From: "xinzhu.yin" Date: Fri, 17 Apr 2026 11:17:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80import=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pqAutomationApp.py | 134 ++++++++++----------------------------------- 1 file changed, 30 insertions(+), 104 deletions(-) diff --git a/pqAutomationApp.py b/pqAutomationApp.py index e6fa2dd..2135651 100644 --- a/pqAutomationApp.py +++ b/pqAutomationApp.py @@ -6,10 +6,14 @@ import threading import time import os import datetime +import colour import json import traceback import numpy as np +import matplotlib.pyplot as plt +import matplotlib.image as mpimg import algorithm.pq_algorithm as pq_algorithm +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from app_version import APP_NAME, APP_VERSION, get_app_title from utils.caSerail import CASerail from utils.tvSerail import tvSerial @@ -23,11 +27,13 @@ from views.collapsing_frame import CollapsingFrame # from views.pq_history_gui import PQHistoryGUI from views.pq_log_gui import PQLogGUI +from colormath.color_objects import xyYColor, LabColor +from colormath.color_conversions import convert_color +from colormath.color_diff import delta_e_cie2000 +from views.pq_debug_panel import PQDebugPanel -plt = None -mpimg = None -FigureCanvasTkAgg = None -colour = None +plt.rcParams["font.family"] = ["sans-serif"] +plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] def get_resource_path(relative_path): @@ -184,59 +190,6 @@ class PQAutomationApp: ) self.status_bar.pack(side=tk.BOTTOM, fill=tk.X) - def _ensure_matplotlib_loaded(self): - """按需加载 matplotlib,避免阻塞主界面启动。""" - global plt, mpimg, FigureCanvasTkAgg - if plt is None or mpimg is None or FigureCanvasTkAgg is None: - import matplotlib.pyplot as _plt - import matplotlib.image as _mpimg - from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg as _FigureCanvasTkAgg - - _plt.rcParams["font.family"] = ["sans-serif"] - _plt.rcParams["font.sans-serif"] = ["Microsoft YaHei"] - - plt = _plt - mpimg = _mpimg - FigureCanvasTkAgg = _FigureCanvasTkAgg - - def _ensure_colour_loaded(self): - """按需加载 colour-science,减少冷启动导入压力。""" - global colour - if colour is None: - import colour as _colour - - colour = _colour - - def _initialize_chart(self, chart_name): - """按需初始化图表。""" - if chart_name == "gamut": - self.init_gamut_chart() - elif chart_name == "gamma": - self.init_gamma_chart() - elif chart_name == "eotf": - self.init_eotf_chart() - elif chart_name == "cct": - self.init_cct_chart() - elif chart_name == "contrast": - self.init_contrast_chart() - elif chart_name == "accuracy": - self.init_accuracy_chart() - - def _ensure_chart_initialized(self, chart_name): - """确保目标图表已完成初始化。""" - if not self.chart_init_state.get(chart_name, False): - self._initialize_chart(chart_name) - self.chart_init_state[chart_name] = True - - def _warmup_remaining_charts(self): - """在界面显示后分帧预热其它图表,降低首屏阻塞。""" - for chart_name in ("gamma", "eotf", "cct", "contrast", "accuracy"): - if self.chart_init_state.get(chart_name, False): - continue - self._ensure_chart_initialized(chart_name) - self.root.after(1, self._warmup_remaining_charts) - return - def get_config_path(self): """获取配置文件的完整路径(兼容打包后的程序)""" import os @@ -274,7 +227,6 @@ class PQAutomationApp: def init_gamut_chart(self): """初始化色域图表 - 手动设置subplot位置,完全避免重叠""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.gamut_chart_frame) container.pack(expand=True, fill=tk.BOTH) @@ -311,7 +263,6 @@ class PQAutomationApp: def init_gamma_chart(self): """初始化Gamma曲线图表 - 左侧曲线 + 右侧表格(✅ 4列 + 通用说明)""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.gamma_chart_frame) container.pack(expand=True, fill=tk.BOTH) @@ -421,7 +372,6 @@ class PQAutomationApp: def init_eotf_chart(self): """初始化 EOTF 曲线图表(HDR 专用)- 左侧曲线 + 右侧表格(✅ 4列)""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.eotf_chart_frame) container.pack(expand=True, fill=tk.BOTH) @@ -527,7 +477,6 @@ class PQAutomationApp: def init_cct_chart(self): """初始化色度坐标图表 - 正向横坐标,标题居中最上方""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.cct_chart_frame) container.pack(expand=True) @@ -573,7 +522,6 @@ class PQAutomationApp: def init_contrast_chart(self): """初始化对比度图表 - 固定大小,居中显示""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.contrast_chart_frame) container.pack(expand=True) @@ -609,7 +557,6 @@ class PQAutomationApp: def init_accuracy_chart(self): """初始化色准图表 - 固定大小,居中显示""" - self._ensure_matplotlib_loaded() container = ttk.Frame(self.accuracy_chart_frame) container.pack(expand=True) @@ -2844,7 +2791,6 @@ class PQAutomationApp: def _run_custom_row_single_step(self, item_id, row_no): """后台执行客户模板单步测试""" try: - self._ensure_colour_loaded() self.root.after(0, lambda: self.status_var.set(f"单步测试第 {row_no} 行...")) self.log_gui.log(f"开始单步测试第 {row_no} 行") @@ -3441,43 +3387,35 @@ class PQAutomationApp: self.chart_notebook.add(self.contrast_chart_frame, text="对比度") self.chart_notebook.add(self.accuracy_chart_frame, text="色准") - # 图表初始化状态:首屏仅初始化当前可见图表,其余延后。 - self.chart_init_state = { - "gamut": False, - "gamma": False, - "eotf": False, - "cct": False, - "contrast": False, - "accuracy": False, - } - - # 首屏只初始化色域图,其他图表在切换 Tab 或空闲时初始化。 - self._ensure_chart_initialized("gamut") - self.root.after(120, self._warmup_remaining_charts) + # 初始化六个独立的图表 + self.init_gamut_chart() + self.init_gamma_chart() + self.init_eotf_chart() + self.init_cct_chart() + self.init_contrast_chart() + self.init_accuracy_chart() # 绑定Tab切换事件 self.chart_notebook.bind("<>", self.on_chart_tab_changed) - # 旧版内嵌调试面板改为按需窗口,不在启动阶段创建复杂控件。 + # ==================== ✅ 在图表下方创建单步调试面板 ==================== + self.debug_container = ttk.LabelFrame( + self.result_frame, # ← 放在 result_frame 内,图表正下方 + text="🔧 单步调试", + padding=10, + ) + # 默认不显示 + + # 创建单步调试面板实例 + self.debug_panel = PQDebugPanel(self.debug_container, self) + + self.log_gui.log("✓ 单步调试面板已创建(放在测试结果图表下方)") def on_chart_tab_changed(self, event): """Tab切换时的事件处理""" try: - selected_tab = self.chart_notebook.select() - tab_to_chart = { - str(self.gamut_chart_frame): "gamut", - str(self.gamma_chart_frame): "gamma", - str(self.eotf_chart_frame): "eotf", - str(self.cct_chart_frame): "cct", - str(self.contrast_chart_frame): "contrast", - str(self.accuracy_chart_frame): "accuracy", - } - chart_name = tab_to_chart.get(selected_tab) - if chart_name: - self._ensure_chart_initialized(chart_name) - self._last_tab_index = self.chart_notebook.index( - selected_tab + self.chart_notebook.select() ) except Exception as e: self.log_gui.log(f"Tab切换事件处理失败: {str(e)}") @@ -6296,7 +6234,6 @@ class PQAutomationApp: # 每完成一个 pattern,实时写入客户模板结果表。 try: - self._ensure_colour_loaded() xy = colour.XYZ_to_xy(np.array([X, Y, Z])) u_prime, v_prime, _ = colour.XYZ_to_CIE1976UCS( np.array([X, Y, Z]) @@ -7208,7 +7145,6 @@ class PQAutomationApp: def plot_gamut(self, results, coverage, test_type): """绘制色域图 - 根据用户选择的参考标准动态计算覆盖率""" - self._ensure_chart_initialized("gamut") self.gamut_ax_xy.clear() self.gamut_ax_uv.clear() @@ -7734,8 +7670,6 @@ class PQAutomationApp: def plot_gamma(self, L_bar, results_with_gamma_list, target_gamma, test_type): """绘制Gamma曲线 + 数据表格(包含实测亮度)""" - self._ensure_chart_initialized("gamma") - # ========== 1. 清空并重置左侧曲线 ========== self.gamma_ax.clear() self.gamma_ax.set_xlim(0, 105) @@ -7870,8 +7804,6 @@ class PQAutomationApp: def plot_eotf(self, L_bar, results_with_eotf_list, test_type): """绘制 EOTF 曲线 + 数据表格(HDR 专用,包含实测亮度)""" - self._ensure_chart_initialized("eotf") - # ========== 1. 清空并重置左侧曲线 ========== self.eotf_ax.clear() self.eotf_ax.set_xlim(0, 105) @@ -8053,8 +7985,6 @@ class PQAutomationApp: def plot_cct(self, test_type): """绘制 x 和 y 坐标分离图 - 每个点标注纵坐标值""" - self._ensure_chart_initialized("cct") - self.cct_fig.clear() gray_data = self.results.get_intermediate_data("shared", "gray") @@ -8371,8 +8301,6 @@ class PQAutomationApp: def plot_contrast(self, contrast_data, test_type): """绘制对比度测试结果 - 固定布局版本""" - self._ensure_chart_initialized("contrast") - # 清空并重置 self.contrast_ax.clear() self.contrast_ax.set_xlim(0, 1) @@ -8534,8 +8462,6 @@ class PQAutomationApp: def plot_accuracy(self, accuracy_data, test_type): """绘制色准测试结果 - 29色显示 - 简洁版布局(显示 Gamma)""" - self._ensure_chart_initialized("accuracy") - self.accuracy_ax.clear() self.accuracy_ax.set_xlim(0, 1) self.accuracy_ax.set_ylim(0, 1)