""" 聊天视图组件 处理普通对话的 UI 展示 """ import tkinter as tk from tkinter import scrolledtext from typing import Callable, Optional class ChatView: """ 聊天视图 包含: - 消息显示区域 - 输入框 - 发送按钮 """ def __init__( self, parent: tk.Widget, on_send: Callable[[str], None] ): """ 初始化聊天视图 Args: parent: 父容器 on_send: 发送消息回调函数 """ self.parent = parent self.on_send = on_send self._create_widgets() def _create_widgets(self): """创建 UI 组件""" # 主框架 self.frame = tk.Frame(self.parent, bg='#1e1e1e') self.frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10) # 标题 title_label = tk.Label( self.frame, text="LocalAgent - 本地 AI 助手", font=('Microsoft YaHei UI', 16, 'bold'), fg='#61dafb', bg='#1e1e1e' ) title_label.pack(pady=(0, 10)) # 消息显示区域 self.message_area = scrolledtext.ScrolledText( self.frame, wrap=tk.WORD, font=('Microsoft YaHei UI', 11), bg='#2d2d2d', fg='#d4d4d4', insertbackground='white', relief=tk.FLAT, padx=10, pady=10, state=tk.DISABLED ) self.message_area.pack(fill=tk.BOTH, expand=True, pady=(0, 10)) # 配置消息标签样式 self.message_area.tag_configure('user', foreground='#4fc3f7', font=('Microsoft YaHei UI', 11, 'bold')) self.message_area.tag_configure('assistant', foreground='#81c784', font=('Microsoft YaHei UI', 11)) self.message_area.tag_configure('system', foreground='#ffb74d', font=('Microsoft YaHei UI', 10, 'italic')) self.message_area.tag_configure('error', foreground='#ef5350', font=('Microsoft YaHei UI', 10)) # 输入区域框架 input_frame = tk.Frame(self.frame, bg='#1e1e1e') input_frame.pack(fill=tk.X) # 输入框 self.input_entry = tk.Entry( input_frame, font=('Microsoft YaHei UI', 12), bg='#3c3c3c', fg='#ffffff', insertbackground='white', relief=tk.FLAT ) self.input_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, ipady=8, padx=(0, 10)) self.input_entry.bind('', self._on_enter_pressed) # 发送按钮 self.send_button = tk.Button( input_frame, text="发送", font=('Microsoft YaHei UI', 11, 'bold'), bg='#0078d4', fg='white', activebackground='#106ebe', activeforeground='white', relief=tk.FLAT, padx=20, pady=5, cursor='hand2', command=self._on_send_clicked ) self.send_button.pack(side=tk.RIGHT) # 显示欢迎消息 welcome_msg = ( "欢迎使用 LocalAgent!\n" "- 输入问题进行对话\n" "- 输入文件处理需求(如\"复制文件\"、\"整理图片\")将触发执行模式" ) self.add_message(welcome_msg, 'system') def _on_enter_pressed(self, event): """回车键处理""" self._on_send_clicked() def _on_send_clicked(self): """发送按钮点击处理""" text = self.input_entry.get().strip() if text: self.input_entry.delete(0, tk.END) self.on_send(text) def add_message(self, message: str, tag: str = 'assistant'): """ 添加消息到显示区域 Args: message: 消息内容 tag: 消息类型 (user/assistant/system/error) """ self.message_area.config(state=tk.NORMAL) # 添加前缀 prefix_map = { 'user': '[你] ', 'assistant': '[助手] ', 'system': '[系统] ', 'error': '[错误] ' } prefix = prefix_map.get(tag, '') self.message_area.insert(tk.END, "\n" + prefix + message + "\n", tag) self.message_area.see(tk.END) self.message_area.config(state=tk.DISABLED) def clear_messages(self): """清空消息区域""" self.message_area.config(state=tk.NORMAL) self.message_area.delete(1.0, tk.END) self.message_area.config(state=tk.DISABLED) def set_input_enabled(self, enabled: bool): """设置输入区域是否可用""" state = tk.NORMAL if enabled else tk.DISABLED self.input_entry.config(state=state) self.send_button.config(state=state) def get_frame(self) -> tk.Frame: """获取主框架""" return self.frame