RDSS/temp/advanced_config.py

222 lines
8.8 KiB
Python
Raw Permalink Normal View History

2026-03-13 14:16:00 +08:00
#!/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()