319 lines
10 KiB
Python
319 lines
10 KiB
Python
"""侧边面板(日志 / Local Dimming / 调试)"""
|
||
|
||
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,
|
||
text="清空记录",
|
||
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",
|
||
"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",
|
||
"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",
|
||
"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"]
|
||
|
||
# 如果窗口已存在且可见,关闭它
|
||
existing = getattr(self, win_attr, None)
|
||
if existing is not None and existing.winfo_exists():
|
||
existing.destroy()
|
||
btn.config(text="打开调试面板")
|
||
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)
|
||
|
||
# 创建调试面板实例(不要对它调用 pack)
|
||
debug_panel_instance = PQDebugPanel(debug_container, self)
|
||
|
||
# 重新启用调试(如果有数据)
|
||
try:
|
||
selected_items = self.get_selected_test_items()
|
||
dlp = cfg["data_log_prefix"]
|
||
# 显式按 test_type 拿历史结果,避免依赖"当前活跃"状态
|
||
results_store = getattr(self, "results", None)
|
||
results_obj = results_store.get(test_type) if results_store is not None else None
|
||
if results_obj is None:
|
||
self.log_gui.log(f"{dlp} 暂无 {test_type} 的测试结果,面板已打开", level="warning")
|
||
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":
|
||
self.log_gui.log("没有可用的灰阶数据", level="error")
|
||
continue
|
||
self.log_gui.log(f" → 加载 {len(data)} 个{data_label}数据点", level="info")
|
||
debug_panel_instance.enable_debug(test_type, debug_key, data)
|
||
except Exception as e:
|
||
self.log_gui.log(f"加载{cfg['failure_data_label']}失败: {str(e)}", level="error")
|
||
self.log_gui.log(traceback.format_exc(), level="error")
|
||
|
||
btn.config(text="关闭调试面板")
|
||
|
||
def on_closing():
|
||
btn.config(text="打开调试面板")
|
||
getattr(self, win_attr).destroy()
|
||
|
||
win.protocol("WM_DELETE_WINDOW", on_closing)
|
||
win.update_idletasks()
|
||
|
||
|
||
def toggle_screen_debug_panel(self):
|
||
_toggle_debug_panel(self, "screen_module")
|
||
|
||
|
||
def toggle_sdr_debug_panel(self):
|
||
_toggle_debug_panel(self, "sdr_movie")
|
||
|
||
|
||
def toggle_hdr_debug_panel(self):
|
||
_toggle_debug_panel(self, "hdr_movie")
|
||
|
||
|
||
|
||
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")
|
||
|
||
# 设置当前选中按钮的样式
|
||
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")
|