"""Local Dimming 测试逻辑(Step 4 重构)。 从 pqAutomationApp.PQAutomationApp 中搬迁。每个函数第一行 `self = app` 以保留原有 `self.xxx` 属性访问不变。 """ import threading import tkinter as tk from tkinter import filedialog, messagebox def start_local_dimming_test(self): """开始 Local Dimming 测试""" # 检查设备连接 if not self.ca or not self.ucd.status: messagebox.showerror("错误", "请先连接 CA410 和 UCD323") return # 禁用按钮 self.ld_start_btn.config(state=tk.DISABLED) self.ld_stop_btn.config(state=tk.NORMAL) self.ld_save_btn.config(state=tk.DISABLED) # 清空结果 for item in self.ld_tree.get_children(): self.ld_tree.delete(item) # 获取配置 wait_time = float(self.ld_wait_time_var.get()) # 在新线程中执行测试 def run_test(): from utils.local_dimming_test import LocalDimmingTest, LocalDimmingController # 从设备当前 timing 获取分辨率 ld_ctrl = LocalDimmingController(self.ucd) cur_w, cur_h = ld_ctrl.get_current_resolution() resolution = f"{cur_w}x{cur_h}" ld_test = LocalDimmingTest( self.ucd, self.ca, log_callback=self.log_gui.log, ) ld_test.wait_time = wait_time results = ld_test.run_test(resolution=resolution) # 保存到实例变量 self.ld_test_instance = ld_test self.ld_test_results = results # 更新结果显示 self.root.after(0, lambda: self.update_ld_results(results)) # 清理临时文件 ld_test.cleanup() # 恢复按钮状态 self.root.after(0, lambda: self.ld_start_btn.config(state=tk.NORMAL)) self.root.after(0, lambda: self.ld_stop_btn.config(state=tk.DISABLED)) self.root.after(0, lambda: self.ld_save_btn.config(state=tk.NORMAL)) threading.Thread(target=run_test, daemon=True).start() def update_ld_results(self, results): """更新 Local Dimming 结果显示""" for percentage, x, y, lv, X, Y, Z in results: self.ld_tree.insert( "", tk.END, values=(f"{percentage}%", f"{lv:.2f}", f"{x:.4f}", f"{y:.4f}"), ) def stop_local_dimming_test(self): """停止 Local Dimming 测试""" if hasattr(self, "ld_test_instance"): self.ld_test_instance.stop() def send_ld_window(self, percentage): """发送指定百分比的窗口""" if not self.ucd.status: messagebox.showwarning("警告", "请先连接 UCD323 设备") return self.log_gui.log(f"🔆 发送 {percentage}% 窗口...") # 记录当前百分比(用于测量) self.current_ld_percentage = percentage def send(): from utils.local_dimming_test import LocalDimmingController ld_controller = LocalDimmingController(self.ucd) # 从设备当前 timing 获取分辨率 width, height = ld_controller.get_current_resolution() # 生成并发送图片 success = ld_controller.send_window_pattern_with_resolution( percentage, width, height ) if success: self.root.after( 0, lambda: self.log_gui.log(f"✅ {percentage}% 窗口已发送") ) else: self.root.after( 0, lambda: self.log_gui.log(f"❌ {percentage}% 窗口发送失败") ) threading.Thread(target=send, daemon=True).start() def measure_ld_luminance(self): """测量当前亮度""" if not self.ca: messagebox.showwarning("警告", "请先连接 CA410 色度计") return if self.current_ld_percentage is None: messagebox.showinfo("提示", "请先发送一个窗口图案") return self.log_gui.log("📏 正在采集亮度...") def measure(): try: x, y, lv, X, Y, Z = self.ca.readAllDisplay() if lv is not None: import datetime timestamp = datetime.datetime.now().strftime("%H:%M:%S") # 更新显示 self.root.after( 0, lambda: self.ld_result_label.config( text=f"亮度: {lv:.2f} cd/m² | x: {x:.4f} | y: {y:.4f}" ), ) # 添加到表格 self.root.after( 0, lambda: self.ld_tree.insert( "", tk.END, values=( f"{self.current_ld_percentage}%", f"{lv:.2f}", f"{x:.4f}", f"{y:.4f}", timestamp, ), ), ) self.root.after( 0, lambda: self.log_gui.log(f"✅ 采集完成: {lv:.2f} cd/m²") ) else: self.root.after(0, lambda: self.log_gui.log("❌ 采集失败")) except Exception as e: self.root.after(0, lambda: self.log_gui.log(f"❌ 采集异常: {str(e)}")) threading.Thread(target=measure, daemon=True).start() def clear_ld_records(self): """清空测试记录""" for item in self.ld_tree.get_children(): self.ld_tree.delete(item) self.ld_result_label.config(text="亮度: -- cd/m² | x: -- | y: --") self.current_ld_percentage = None self.log_gui.log("🗑️ 测试记录已清空") def save_local_dimming_results(self): """保存 Local Dimming 结果""" from tkinter import filedialog import csv import datetime if len(self.ld_tree.get_children()) == 0: messagebox.showinfo("提示", "没有可保存的数据") return default_name = f"LocalDimming_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.csv" save_path = filedialog.asksaveasfilename( title="保存测试结果", initialfile=default_name, defaultextension=".csv", filetypes=[("CSV 文件", "*.csv"), ("所有文件", "*.*")], ) if not save_path: return try: with open(save_path, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow(["窗口百分比", "亮度 (cd/m²)", "x", "y", "时间"]) for item in self.ld_tree.get_children(): values = self.ld_tree.item(item, "values") writer.writerow(values) self.log_gui.log(f"✓ 测试结果已保存: {save_path}") messagebox.showinfo("成功", f"测试结果已保存到:\n{save_path}") except Exception as e: self.log_gui.log(f"❌ 保存失败: {str(e)}") messagebox.showerror("错误", f"保存失败: {str(e)}")