Initial commit

This commit is contained in:
Mimikko-zeus
2026-01-07 00:17:46 +08:00
commit 4b3286f546
49 changed files with 2492 additions and 0 deletions

164
ui/chat_view.py Normal file
View File

@@ -0,0 +1,164 @@
"""
聊天视图组件
处理普通对话的 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('<Return>', 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