import tkinter as tk
from tkinter import scrolledtext, font
import requests
import json
import re
class MarkdownRenderer:
@staticmethod
def apply_markdown(text_widget, text):
"""
在文本组件中应用基础Markdown格式
支持:**粗体** *斜体* `代码块`
"""
# 清除旧标签
text_widget.configure(state="normal")
text_widget.delete("1.0", tk.END)
# 预定义样式
text_widget.tag_configure("bold", font=("Arial", 10, "bold"))
text_widget.tag_configure("italic", font=("Arial", 10, "italic"))
text_widget.tag_configure("code", background="#f0f0f0", relief="solid", borderwidth=1)
# 正则表达式匹配
patterns = [
(r"\*\*(.*?)\*\*", "bold"),
(r"\*(.*?)\*", "italic"),
(r"`(.*?)`", "code")
]
# 插入文本并应用标签
position = 0
for line in text.split('\n'):
insert_pos = f"1.{position}"
text_widget.insert(insert_pos, line + "\n")
for pattern, tag in patterns:
matches = re.finditer(pattern, line)
for match in matches:
start = match.start()
end = match.end()
text_widget.tag_add(
tag,
f"{insert_pos}+{start}c",
f"{insert_pos}+{end}c"
)
position += len(line) + 1 # +1 for newline
class DeepSeekChat:
def __init__(self, root):
self.root = root
self.root.title("DeepSeek Chat (Markdown)")
# 设置字体
self.base_font = font.Font(family="Arial", size=10)
# 聊天历史区域
self.chat_history = scrolledtext.ScrolledText(
root,
wrap=tk.WORD,
font=self.base_font,
padx=10,
pady=10
)
self.chat_history.pack(expand=True, fill="both")
# 输入区域
self.input_frame = tk.Frame(root)
self.input_frame.pack(fill="x", padx=10, pady=10)
self.user_input = tk.Entry(self.input_frame, font=self.base_font)
self.user_input.pack(side="left", expand=True, fill="x")
self.send_btn = tk.Button(
self.input_frame,
text="Send",
command=self.send_message,
bg="#4CAF50",
fg="white"
)
self.send_btn.pack(side="right", padx=5)
# API配置
self.API_KEY = "skapi" # 替换为你的API Key
self.API_URL = "https://api.deepseek.com/v1/chat/completions"
# 对话历史
self.conversation = []
# 绑定回车键
self.user_input.bind("<Return>", lambda event: self.send_message())
def send_message(self):
query = self.user_input.get().strip()
if not query:
return
self.user_input.delete(0, tk.END)
self._add_message("You", query, is_user=True)
try:
response = self._get_api_response(query)
self._add_message("AI", response, is_user=False)
except Exception as e:
self._add_message("System", f"Error: {str(e)}", is_user=False)
def _get_api_response(self, query):
headers = {
"Authorization": f"Bearer {self.API_KEY}",
"Content-Type": "application/json"
}
self.conversation.append({"role": "user", "content": query})
payload = {
"model": "deepseek-chat",
"messages": self.conversation,
"temperature": 0.7,
"stream": False
}
response = requests.post(
self.API_URL,
headers=headers,
json=payload,
timeout=30
)
if response.status_code == 200:
result = response.json()
content = result['choices'][0]['message']['content']
self.conversation.append({"role": "assistant", "content": content})
return content
else:
raise Exception(f"API Error {response.status_code}: {response.text}")
def _add_message(self, sender, message, is_user):
# 添加消息头
self.chat_history.configure(state="normal")
self.chat_history.insert(tk.END, f"{sender}: \n", "header")
# 创建临时文本框处理Markdown
temp_text = tk.Text(self.chat_history, wrap=tk.WORD)
MarkdownRenderer.apply_markdown(temp_text, message)
# 获取格式化的内容
formatted_content = temp_text.get("1.0", tk.END)
self.chat_history.insert(tk.END, formatted_content)
# 复制标签配置
for tag in temp_text.tag_names():
ranges = temp_text.tag_ranges(tag)
for i in range(0, len(ranges), 2):
start = self.chat_history.index(
f"end-1c - {len(formatted_content)-int(ranges[i].string.split('.')[1])} chars"
)
end = self.chat_history.index(
f"{start}+{int(ranges[i+1].string.split('.')[1]) - int(ranges[i].string.split('.')[1])}c"
)
self.chat_history.tag_add(tag, start, end)
self.chat_history.insert(tk.END, "\n\n")
self.chat_history.configure(state="disabled")
self.chat_history.see(tk.END)
if __name__ == "__main__":
root = tk.Tk()
app = DeepSeekChat(root)
root.mainloop()
用python接入deepseek
最新推荐文章于 2025-03-12 18:24:31 发布