From fbb17e42742483ae916b7c50196f777e871c5ccb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Wed, 30 Apr 2025 09:33:49 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E6=83=B3=E6=B3=95=E9=98=9F=E5=88=97=E5=8F=8A=E5=AE=9E?= =?UTF-8?q?=E6=97=B6=E7=9B=91=E6=8E=A7=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/interest_monitor_gui.py | 99 ++++++++++++++++++++++++++++++++- 1 file changed, 98 insertions(+), 1 deletion(-) diff --git a/scripts/interest_monitor_gui.py b/scripts/interest_monitor_gui.py index fb9e51cf8..fb61eefde 100644 --- a/scripts/interest_monitor_gui.py +++ b/scripts/interest_monitor_gui.py @@ -19,6 +19,7 @@ REFRESH_INTERVAL_MS = 200 # 刷新间隔 (毫秒) - 可以适当调长,因为 WINDOW_TITLE = "Interest Monitor (Live History)" MAX_HISTORY_POINTS = 1000 # 图表上显示的最大历史点数 (可以增加) MAX_STREAMS_TO_DISPLAY = 15 # 最多显示多少个聊天流的折线图 (可以增加) +MAX_QUEUE_SIZE = 30 # 新增:历史想法队列最大长度 # *** 添加 Matplotlib 中文字体配置 *** # 尝试使用 'SimHei' 或 'Microsoft YaHei',如果找不到,matplotlib 会回退到默认字体 @@ -61,6 +62,10 @@ class InterestMonitorApp: self.single_stream_last_active = tk.StringVar(value="活跃: N/A") self.single_stream_last_interaction = tk.StringVar(value="交互: N/A") + # 新增:历史想法队列 + self.main_mind_history = deque(maxlen=MAX_QUEUE_SIZE) + self.last_main_mind_timestamp = 0 # 记录最后一条main_mind的时间戳 + # --- UI 元素 --- # --- 新增:顶部全局信息框架 --- @@ -143,6 +148,20 @@ class InterestMonitorApp: self.canvas_widget_single = self.canvas_single.get_tk_widget() self.canvas_widget_single.pack(side=tk.TOP, fill=tk.BOTH, expand=1) + # --- 新增第三个选项卡:麦麦历史想法 --- + self.frame_mind_history = ttk.Frame(self.notebook, padding="5 5 5 5") + self.notebook.add(self.frame_mind_history, text="麦麦历史想法") + + # 聊天框样式的文本框(只读)+ 滚动条 + self.mind_text_scroll = tk.Scrollbar(self.frame_mind_history) + self.mind_text_scroll.pack(side=tk.RIGHT, fill=tk.Y) + self.mind_text = tk.Text( + self.frame_mind_history, height=25, state="disabled", wrap="word", font=("微软雅黑", 12), + yscrollcommand=self.mind_text_scroll.set + ) + self.mind_text.pack(side=tk.LEFT, fill=tk.BOTH, expand=1, padx=5, pady=5) + self.mind_text_scroll.config(command=self.mind_text.yview) + # --- 初始化和启动刷新 --- self.update_display() # 首次加载并开始刷新循环 @@ -154,6 +173,78 @@ class InterestMonitorApp: """生成随机颜色用于区分线条""" return "#{:06x}".format(random.randint(0, 0xFFFFFF)) + def load_main_mind_history(self): + """只读取包含main_mind的日志行,维护历史想法队列""" + if not os.path.exists(LOG_FILE_PATH): + return + + main_mind_entries = [] + try: + with open(LOG_FILE_PATH, "r", encoding="utf-8") as f: + for line in f: + try: + log_entry = json.loads(line.strip()) + if "main_mind" in log_entry: + ts = log_entry.get("timestamp", 0) + main_mind_entries.append((ts, log_entry)) + except Exception: + continue + main_mind_entries.sort(key=lambda x: x[0]) + recent_entries = main_mind_entries[-MAX_QUEUE_SIZE:] + self.main_mind_history.clear() + for ts, entry in recent_entries: + self.main_mind_history.append(entry) + if recent_entries: + self.last_main_mind_timestamp = recent_entries[-1][0] + # 首次加载时刷新 + self.refresh_mind_text() + except Exception: + pass + + def update_main_mind_history(self): + """实时监控log文件,发现新main_mind数据则更新队列和展示(仅有新数据时刷新)""" + if not os.path.exists(LOG_FILE_PATH): + return + + new_entries = [] + try: + with open(LOG_FILE_PATH, "r", encoding="utf-8") as f: + for line in reversed(list(f)): + try: + log_entry = json.loads(line.strip()) + if "main_mind" in log_entry: + ts = log_entry.get("timestamp", 0) + if ts > self.last_main_mind_timestamp: + new_entries.append((ts, log_entry)) + else: + break + except Exception: + continue + if new_entries: + for ts, entry in sorted(new_entries): + if len(self.main_mind_history) >= MAX_QUEUE_SIZE: + self.main_mind_history.popleft() + self.main_mind_history.append(entry) + self.last_main_mind_timestamp = ts + self.refresh_mind_text() # 只有有新数据时才刷新 + except Exception: + pass + + def refresh_mind_text(self): + """刷新聊天框样式的历史想法展示""" + self.mind_text.config(state="normal") + self.mind_text.delete(1.0, tk.END) + for entry in self.main_mind_history: + ts = entry.get("timestamp", 0) + dt_str = datetime.fromtimestamp(ts).strftime("%Y-%m-%d %H:%M:%S") if ts else "" + main_mind = entry.get("main_mind", "") + mai_state = entry.get("mai_state", "") + subflow_count = entry.get("subflow_count", "") + msg = f"[{dt_str}] 状态:{mai_state} 子流:{subflow_count}\n{main_mind}\n\n" + self.mind_text.insert(tk.END, msg) + self.mind_text.see(tk.END) + self.mind_text.config(state="disabled") + def load_and_update_history(self): """从 history log 文件加载数据并更新历史记录""" if not os.path.exists(LOG_FILE_PATH): @@ -537,8 +628,14 @@ class InterestMonitorApp: def update_display(self): """主更新循环""" try: - self.load_and_update_history() # 从文件加载数据并更新内部状态 + # --- 新增:首次加载历史想法 --- + if not hasattr(self, "_main_mind_loaded"): + self.load_main_mind_history() + self._main_mind_loaded = True + else: + self.update_main_mind_history() # 只有有新main_mind数据时才刷新界面 # *** 修改:分别调用两个图表的更新方法 *** + self.load_and_update_history() # 从文件加载数据并更新内部状态 self.update_all_streams_plot() # 更新所有流的图表 self.update_single_stream_plot() # 更新单个流的图表 except Exception as e: