目录
一、背景
二、具体代码
1.初始化openAI客户端
2.定义历史记录文件前缀和目录
3.创建ChatGUI类
4.设置GUI界面
5.处理Markdown文本
6.处理用户输入和模型响应
三、完整代码
四、总结
随着人工智能技术的快速发展,自然语言处理(NLP)模型在各个领域的应用越来越广泛。OpenAI的GPT系列模型因其强大的语言生成能力而备受关注。为了更好地利用这些模型,开发一个用户友好的图形用户界面(GUI)是非常必要的。本文将介绍如何使用Python和Tkinter库开发一个基于OpenAI API的DeepSeek Chat GUI,并结合代码详细讲解其实现过程。
简略版请看原文
首先,我们需要初始化OpenAI客户端,以便与API进行通信。以下是初始化代码:
from openai import OpenAI
import os
import json
import threading
import tkinter as tk
from tkinter import ttk, scrolledtext, messagebox, filedialog
import re
from datetime import datetime
# 初始化OpenAI客户端
client = OpenAI(
api_key="sk-xxxxx",
base_url="https://api.deepseek.com",
)
这部分代码导入了所需的模块,并初始化了OpenAI客户端。client对象将用于与OpenAI API进行通信,发送请求并接收响应。
为了方便保存和加载对话历史,我们定义了历史记录文件的前缀和目录:
# 定义历史记录文件前缀和目录
HISTORY_FILE_PREFIX = "history_"
HISTORY_FILE_DIR = "history_records"
# 确保历史记录目录存在
if not os.path.exists(HISTORY_FILE_DIR):
os.makedirs(HISTORY_FILE_DIR)
我们定义了历史记录文件的命名规则和存储目录。通过`os.makedirs`确保目录存在,避免文件保存时出现错误。
接下来,我们创建`ChatGUI`类,该类负责管理GUI的各个组件和功能。
class ChatGUI:
def __init__(self, master):
self.master = master
self.model = "deepseek-chat"
self.long_text_mode = False
self.conversation_history = [{"role": "system", "content": "You are a helpful assistant"}]
self.is_streaming = False
self.setup_ui()
self.setup_markdown_tags()
ChatGUI类是GUI的核心,负责初始化界面和功能。conversation_history用于存储对话历史,setup_ui和setup_markdown_tags分别用于设置界面和Markdown样式。
在setup_ui方法中,我们设置了GUI的各个组件,包括顶部控制栏、对话显示区域、输入区域和底部按钮。
def setup_ui(self):
self.master.title("DeepSeek Chat GUI")
self.master.geometry("800x600")
# 顶部控制栏
control_frame = ttk.Frame(self.master)
control_frame.pack(fill=tk.X, padx=5, pady=5)
self.model_var = tk.StringVar(value=self.model)
model_combobox = ttk.Combobox(control_frame, textvariable=self.model_var,
values=["deepseek-chat", "deepseek-reasoner", "deepseek-coder"], width=15)
model_combobox.pack(side=tk.LEFT, padx=5)
model_combobox.bind("<>", self.on_model_change)
ttk.Button(control_frame, text="保存历史", command=self.save_history).pack(side=tk.LEFT, padx=5)
ttk.Button(control_frame, text="清空历史", command=self.clear_history).pack(side=tk.LEFT, padx=5)
ttk.Button(control_frame, text="加载历史", command=self.load_history_dialog).pack(side=tk.LEFT, padx=5)
# 对话显示区域
self.chat_area = scrolledtext.ScrolledText(self.master, wrap=tk.WORD, state=tk.DISABLED)
self.chat_area.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)
# 输入区域
input_frame