Files
pqAutomationApp/app/views/panels/side_panels.py

319 lines
10 KiB
Python
Raw Normal View History

2026-04-21 16:03:11 +08:00
"""侧边面板(日志 / Local Dimming / 调试)"""
2026-04-20 11:48:38 +08:00
import traceback
import tkinter as tk
import ttkbootstrap as ttk
from app.views.pq_log_gui import PQLogGUI
from app.views.pq_debug_panel import PQDebugPanel
def create_log_panel(self):
"""创建日志面板"""
self.log_frame = ttk.Frame(self.content_frame)
self.log_gui = PQLogGUI(self.log_frame)
self.log_gui.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)
# 默认隐藏日志面板
self.log_visible = False
# 注册到面板管理系统
self.register_panel(
"log", self.log_frame, None, "log_visible"
) # button会在后面设置
def create_local_dimming_panel(self):
"""创建 Local Dimming 测试面板 - 手动控制版"""
self.local_dimming_frame = ttk.Frame(self.content_frame)
# 主容器
main_container = ttk.Frame(self.local_dimming_frame, padding=10)
main_container.pack(fill=tk.BOTH, expand=True)
# ==================== 1. 标题 ====================
title_frame = ttk.Frame(main_container)
title_frame.pack(fill=tk.X, pady=(0, 10))
ttk.Label(
title_frame,
text="🔆 Local Dimming 窗口测试",
font=("微软雅黑", 14, "bold"),
).pack(side=tk.LEFT)
# ==================== 2. 窗口百分比按钮 ====================
window_frame = ttk.LabelFrame(
main_container, text="🔆 窗口百分比(点击发送)", padding=10
)
window_frame.pack(fill=tk.X, pady=(0, 10))
# 说明文字
ttk.Label(
window_frame,
text="点击按钮发送对应百分比的白色窗口(黑色背景 + 居中白色矩形)",
font=("", 9),
foreground="#28a745",
).pack(pady=(0, 8))
# 第一行1%, 2%, 5%, 10%, 18%
row1 = ttk.Frame(window_frame)
row1.pack(fill=tk.X, pady=(0, 5))
percentages_row1 = [1, 2, 5, 10, 18]
for p in percentages_row1:
ttk.Button(
row1,
text=f"{p}%",
command=lambda p=p: self.send_ld_window(p),
bootstyle="success",
width=12,
).pack(side=tk.LEFT, padx=3)
# 第二行25%, 50%, 75%, 100%
row2 = ttk.Frame(window_frame)
row2.pack(fill=tk.X)
percentages_row2 = [25, 50, 75, 100]
for p in percentages_row2:
ttk.Button(
row2,
text=f"{p}%",
command=lambda p=p: self.send_ld_window(p),
bootstyle="success",
width=12,
).pack(side=tk.LEFT, padx=3)
# ==================== 4. CA410 采集按钮 ====================
measure_frame = ttk.LabelFrame(main_container, text="📊 CA410 测量", padding=10)
measure_frame.pack(fill=tk.X, pady=(0, 10))
measure_btn_frame = ttk.Frame(measure_frame)
measure_btn_frame.pack(fill=tk.X)
self.ld_measure_btn = ttk.Button(
measure_btn_frame,
text="📏 采集当前亮度",
command=self.measure_ld_luminance,
bootstyle="primary",
width=15,
)
self.ld_measure_btn.pack(side=tk.LEFT, padx=(0, 5))
# 显示测量结果
self.ld_result_label = ttk.Label(
measure_btn_frame,
text="亮度: -- cd/m² | x: -- | y: --",
font=("Consolas", 10),
foreground="#007bff",
)
self.ld_result_label.pack(side=tk.LEFT, padx=(10, 0))
# ==================== 5. 测试结果表格 ====================
result_frame = ttk.LabelFrame(main_container, text="📋 测试记录", padding=10)
result_frame.pack(fill=tk.BOTH, expand=True, pady=(0, 10))
# Treeview
columns = ("窗口百分比", "亮度 (cd/m²)", "x", "y", "时间")
self.ld_tree = ttk.Treeview(
result_frame, columns=columns, show="headings", height=10
)
for col in columns:
self.ld_tree.heading(col, text=col)
if col == "窗口百分比":
self.ld_tree.column(col, width=100, anchor=tk.CENTER)
elif col == "时间":
self.ld_tree.column(col, width=120, anchor=tk.CENTER)
else:
self.ld_tree.column(col, width=100, anchor=tk.CENTER)
self.ld_tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 滚动条
scrollbar = ttk.Scrollbar(
result_frame, orient=tk.VERTICAL, command=self.ld_tree.yview
)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.ld_tree.configure(yscrollcommand=scrollbar.set)
# ==================== 6. 底部操作按钮 ====================
bottom_frame = ttk.Frame(main_container)
bottom_frame.pack(fill=tk.X)
self.ld_clear_btn = ttk.Button(
bottom_frame,
2026-04-21 15:31:48 +08:00
text="清空记录",
2026-04-20 11:48:38 +08:00
command=self.clear_ld_records,
bootstyle="danger-outline",
width=12,
)
self.ld_clear_btn.pack(side=tk.LEFT, padx=(0, 5))
self.ld_save_btn = ttk.Button(
bottom_frame,
text="💾 保存结果",
command=self.save_local_dimming_results,
bootstyle="info",
width=12,
)
self.ld_save_btn.pack(side=tk.LEFT)
# 默认隐藏
self.local_dimming_visible = False
# 注册到面板管理系统
self.register_panel(
"local_dimming",
self.local_dimming_frame,
None,
"local_dimming_visible",
)
# 初始化当前窗口百分比(用于记录)
self.current_ld_percentage = None
def toggle_local_dimming_panel(self):
"""切换 Local Dimming 面板显示"""
self.show_panel("local_dimming")
def toggle_log_panel(self):
"""切换日志面板的显示状态"""
self.show_panel("log")
# ---- 单步调试面板(统一实现) ----
DEBUG_PANEL_CONFIGS = {
"screen_module": {
"window_attr": "debug_window",
"btn_attr": "screen_debug_btn",
2026-04-21 15:31:48 +08:00
"title": " 单步调试面板",
"window_log_prefix": "",
"data_log_prefix": "屏模组",
"failure_data_label": "调试数据",
# (item_key, debug_key, (category, subkey), data_label, enable_desc)
"data_items": [
("gamma", "gamma", ("shared", "gray"), "灰阶", "Gamma 单步调试"),
("gamut", "rgb", ("gamut", "rgb"), "RGB", "RGB 单步调试"),
],
},
"sdr_movie": {
"window_attr": "sdr_debug_window",
"btn_attr": "sdr_debug_btn",
2026-04-21 15:31:48 +08:00
"title": " SDR 单步调试面板",
"window_log_prefix": "SDR ",
"data_log_prefix": "SDR",
"failure_data_label": "SDR 调试数据",
"data_items": [
("gamma", "gamma", ("shared", "gray"), "灰阶", "Gamma 单步调试"),
("accuracy", "accuracy", ("accuracy", "measured"), "色准", "色准单步调试"),
("gamut", "rgb", ("gamut", "rgb"), "RGB", "RGB 单步调试"),
],
},
"hdr_movie": {
"window_attr": "hdr_debug_window",
"btn_attr": "hdr_debug_btn",
2026-04-21 15:31:48 +08:00
"title": " HDR 单步调试面板",
"window_log_prefix": "HDR ",
"data_log_prefix": "HDR",
"failure_data_label": "HDR 调试数据",
"data_items": [
("eotf", "eotf", ("shared", "gray"), "灰阶", "EOTF 单步调试"),
("accuracy", "accuracy", ("accuracy", "measured"), "色准", "色准单步调试"),
("gamut", "rgb", ("gamut", "rgb"), "RGB", "RGB 单步调试"),
],
},
}
def _toggle_debug_panel(self, test_type):
"""打开/关闭对应测试类型的单步调试面板(独立窗口)。"""
cfg = DEBUG_PANEL_CONFIGS[test_type]
win_attr = cfg["window_attr"]
btn = getattr(self, cfg["btn_attr"])
wlp = cfg["window_log_prefix"]
2026-04-20 11:48:38 +08:00
# 如果窗口已存在且可见,关闭它
existing = getattr(self, win_attr, None)
if existing is not None and existing.winfo_exists():
existing.destroy()
btn.config(text="打开调试面板")
2026-04-20 11:48:38 +08:00
return
# 创建新窗口
win = ttk.Toplevel(self.root)
win.title(cfg["title"])
win.geometry("900x400")
win.transient(self.root)
setattr(self, win_attr, win)
# 调试面板容器
debug_container = ttk.Frame(win, padding=10)
debug_container.pack(fill=tk.BOTH, expand=True)
2026-04-20 11:48:38 +08:00
# 创建调试面板实例(不要对它调用 pack
2026-04-20 11:48:38 +08:00
debug_panel_instance = PQDebugPanel(debug_container, self)
# 重新启用调试(如果有数据)
try:
selected_items = self.get_selected_test_items()
dlp = cfg["data_log_prefix"]
2026-04-21 16:03:11 +08:00
# 显式按 test_type 拿历史结果,避免依赖"当前活跃"状态
results_store = getattr(self, "results", None)
results_obj = results_store.get(test_type) if results_store is not None else None
2026-04-21 15:31:48 +08:00
if results_obj is None:
2026-04-21 16:03:11 +08:00
self.log_gui.log(f"{dlp} 暂无 {test_type} 的测试结果,面板已打开", level="warning")
2026-04-21 15:31:48 +08:00
else:
for item_key, debug_key, (cat, sub), data_label, enable_desc in cfg["data_items"]:
if item_key not in selected_items:
continue
data = results_obj.get_intermediate_data(cat, sub)
if not data:
if test_type == "screen_module" and item_key == "gamma":
2026-04-21 16:03:11 +08:00
self.log_gui.log("没有可用的灰阶数据", level="error")
2026-04-21 15:31:48 +08:00
continue
self.log_gui.log(f" → 加载 {len(data)}{data_label}数据点", level="info")
debug_panel_instance.enable_debug(test_type, debug_key, data)
2026-04-20 11:48:38 +08:00
except Exception as e:
2026-04-21 15:31:48 +08:00
self.log_gui.log(f"加载{cfg['failure_data_label']}失败: {str(e)}", level="error")
self.log_gui.log(traceback.format_exc(), level="error")
2026-04-20 11:48:38 +08:00
btn.config(text="关闭调试面板")
2026-04-20 11:48:38 +08:00
def on_closing():
btn.config(text="打开调试面板")
getattr(self, win_attr).destroy()
2026-04-20 11:48:38 +08:00
win.protocol("WM_DELETE_WINDOW", on_closing)
win.update_idletasks()
2026-04-20 11:48:38 +08:00
def toggle_screen_debug_panel(self):
_toggle_debug_panel(self, "screen_module")
2026-04-20 11:48:38 +08:00
def toggle_sdr_debug_panel(self):
_toggle_debug_panel(self, "sdr_movie")
2026-04-20 11:48:38 +08:00
def toggle_hdr_debug_panel(self):
_toggle_debug_panel(self, "hdr_movie")
2026-04-20 11:48:38 +08:00
def update_sidebar_selection(self):
"""更新侧边栏按钮的选中状态"""
# 重置所有按钮样式为默认
self.screen_module_btn.configure(style="Sidebar.TButton")
self.sdr_movie_btn.configure(style="Sidebar.TButton")
self.hdr_movie_btn.configure(style="Sidebar.TButton")
2026-04-20 11:48:38 +08:00
# 设置当前选中按钮的样式
current_type = self.test_type_var.get()
if current_type == "screen_module":
self.screen_module_btn.configure(style="SidebarSelected.TButton")
elif current_type == "sdr_movie":
self.sdr_movie_btn.configure(style="SidebarSelected.TButton")
elif current_type == "hdr_movie":
self.hdr_movie_btn.configure(style="SidebarSelected.TButton")