#!/usr/bin/env python3 """ 高级选项选项卡 """ import customtkinter as ctk class AdvancedConfigTab(ctk.CTkFrame): def __init__(self, parent): super().__init__(parent) # 配置网格布局 self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(0, weight=0) self.grid_rowconfigure(1, weight=1) # 模式变量 self.generation_mode_var = ctk.StringVar(value="random") # 模式参数框架 self.params_frame = ctk.CTkFrame(self) self.params_frame.grid(row=0, column=0, sticky="nsew") # 显示当前模式参数 self.update_params_display() def on_mode_change(self): """模式变化时的回调""" self.update_params_display() def update_params_display(self): """更新参数显示""" # 清空现有内容 for widget in self.params_frame.winfo_children(): widget.destroy() mode = self.generation_mode_var.get() if mode == "random": # 随机模式参数已移至基本设置 pass elif mode == "fixed": # 固定模式参数 ctk.CTkLabel( self.params_frame, text="固定模式参数", font=ctk.CTkFont(size=12, weight="bold") ).grid(row=0, column=0, sticky="w", padx=20, pady=10) # 每事件信号数 ctk.CTkLabel(self.params_frame, text="每事件信号数:").grid(row=1, column=0, sticky="w", padx=40, pady=5) self.num_signals_var = ctk.IntVar(value=5) ctk.CTkEntry( self.params_frame, textvariable=self.num_signals_var, width=100 ).grid(row=1, column=1, sticky="w", padx=10, pady=5) # 能量水平 ctk.CTkLabel(self.params_frame, text="能量水平:").grid(row=2, column=0, sticky="w", padx=40, pady=5) self.energy_levels_var = ctk.StringVar(value="1000, 2000, 3000, 4000, 5000") ctk.CTkEntry( self.params_frame, textvariable=self.energy_levels_var, width=300 ).grid(row=2, column=1, sticky="w", padx=10, pady=5) # 时间戳序列 ctk.CTkLabel(self.params_frame, text="时间戳序列:").grid(row=3, column=0, sticky="w", padx=40, pady=5) self.timestamps_var = ctk.StringVar(value="10, 50, 100, 200, 300") ctk.CTkEntry( self.params_frame, textvariable=self.timestamps_var, width=300 ).grid(row=3, column=1, sticky="w", padx=10, pady=5) # 重复使用模式 self.repeat_pattern_var = ctk.BooleanVar(value=True) ctk.CTkCheckBox( self.params_frame, text="重复使用模式", variable=self.repeat_pattern_var ).grid(row=4, column=0, columnspan=2, sticky="w", padx=40, pady=10) elif mode == "pulse": # 脉冲模式参数 ctk.CTkLabel( self.params_frame, text="脉冲模式参数", font=ctk.CTkFont(size=12, weight="bold") ).grid(row=0, column=0, sticky="w", padx=20, pady=10) # 脉冲数量 ctk.CTkLabel(self.params_frame, text="脉冲数量:").grid(row=1, column=0, sticky="w", padx=40, pady=5) self.pulse_count_var = ctk.IntVar(value=100) ctk.CTkEntry( self.params_frame, textvariable=self.pulse_count_var, width=100 ).grid(row=1, column=1, sticky="w", padx=10, pady=5) # 脉冲间隔 ctk.CTkLabel(self.params_frame, text="脉冲间隔(us):").grid(row=2, column=0, sticky="w", padx=40, pady=5) self.pulse_interval_var = ctk.IntVar(value=2) ctk.CTkEntry( self.params_frame, textvariable=self.pulse_interval_var, width=100 ).grid(row=2, column=1, sticky="w", padx=10, pady=5) # 脉冲宽度 ctk.CTkLabel(self.params_frame, text="脉冲宽度(信号数):").grid(row=3, column=0, sticky="w", padx=40, pady=5) self.pulse_width_var = ctk.IntVar(value=1) ctk.CTkEntry( self.params_frame, textvariable=self.pulse_width_var, width=100 ).grid(row=3, column=1, sticky="w", padx=10, pady=5) # 时间抖动 ctk.CTkLabel(self.params_frame, text="时间抖动(us):").grid(row=4, column=0, sticky="w", padx=40, pady=5) self.jitter_var = ctk.DoubleVar(value=0.0) ctk.CTkEntry( self.params_frame, textvariable=self.jitter_var, width=100 ).grid(row=4, column=1, sticky="w", padx=10, pady=5) # 能量噪声 ctk.CTkLabel(self.params_frame, text="能量噪声(keV):").grid(row=5, column=0, sticky="w", padx=40, pady=5) self.energy_noise_var = ctk.DoubleVar(value=0.0) ctk.CTkEntry( self.params_frame, textvariable=self.energy_noise_var, width=100 ).grid(row=5, column=1, sticky="w", padx=10, pady=5) def save_params(self): """保存参数""" # 这里可以添加保存逻辑 pass def get_config(self): """获取配置""" mode = self.generation_mode_var.get() if mode == "random": return { "event_generation_mode": mode } elif mode == "fixed": # 解析能量水平和时间戳 energy_levels = list(map(float, self.energy_levels_var.get().split(','))) timestamps = list(map(float, self.timestamps_var.get().split(','))) return { "event_generation_mode": mode, "fixed_events": { "num_signals_per_event": self.num_signals_var.get(), "energy_levels": { "detector1": energy_levels, "detector2": [e * 0.8 for e in energy_levels], "detector3": [e * 0.5 for e in energy_levels] }, "timestamps": timestamps, "repeat_pattern": self.repeat_pattern_var.get() } } elif mode == "pulse": return { "event_generation_mode": mode, "pulse_signals": { "pulse_count": self.pulse_count_var.get(), "pulse_interval": self.pulse_interval_var.get(), "pulse_width": self.pulse_width_var.get(), "energy_levels": { "detector1": 1500, "detector2": 1200, "detector3": 900 }, "jitter": self.jitter_var.get(), "energy_noise": self.energy_noise_var.get() } } return {} def set_config(self, config): """设置配置""" if "event_generation_mode" in config: self.generation_mode_var.set(config["event_generation_mode"]) if config.get("event_generation_mode") == "fixed" and "fixed_events" in config: fixed = config["fixed_events"] if "num_signals_per_event" in fixed: self.num_signals_var.set(fixed["num_signals_per_event"]) if "energy_levels" in fixed and "detector1" in fixed["energy_levels"]: self.energy_levels_var.set(", ".join(map(str, fixed["energy_levels"]["detector1"]))) if "timestamps" in fixed: self.timestamps_var.set(", ".join(map(str, fixed["timestamps"]))) if "repeat_pattern" in fixed: self.repeat_pattern_var.set(fixed["repeat_pattern"]) if config.get("event_generation_mode") == "pulse" and "pulse_signals" in config: pulse = config["pulse_signals"] if "pulse_count" in pulse: self.pulse_count_var.set(pulse["pulse_count"]) if "pulse_interval" in pulse: self.pulse_interval_var.set(pulse["pulse_interval"]) if "pulse_width" in pulse: self.pulse_width_var.set(pulse["pulse_width"]) if "jitter" in pulse: self.jitter_var.set(pulse["jitter"]) if "energy_noise" in pulse: self.energy_noise_var.set(pulse["energy_noise"]) # 更新显示 self.update_params_display()