222 lines
8.8 KiB
Python
222 lines
8.8 KiB
Python
|
|
#!/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()
|