先分享界面效果如下,可以切换使用R1和V3模型,代码很简单,大家买好api key后可以自己弄着玩:
在询问问题过程中的等待界面是需要自己按喜好设置一个gif,效果如下:
步骤 1:获取 DeepSeek API Key
首先,你需要从 DeepSeek 获取一个有效的 API Key。可以在 DeepSeek官网 上注册并获取。记得保管好你的 API Key,因为它将用于验证你的请求。(一定要截图,只能获取一次后面就看不到了)
步骤 2:环境准备及代码分享
- 安装 Python:确保你已经安装了 Python 3.6 及以上版本。如果没有安装,可以从 Python官网
https://www.python.org/downloads/ 下载并安装。
- 安装必要的库:运行命令安装 PyQt6 和 requests 库。
- 本文提供的代码将创建一个包含聊天窗口、输入框、发送按钮、以及模型选择下拉菜单的应用程序。应用会根据选择的模型和用户输入,通过 DeepSeek API 发送请求并展示返回的响应。需要做的:1,将你买的api-key放在代码中。2,替换图片路径为你保存的图片的路径
import sys import json from PyQt6.QtWidgets import ( QApplication, QMainWindow, QWidget, QVBoxLayout, QTextEdit, QLineEdit, QPushButton, QLabel, QComboBox ) from PyQt6.QtCore import Qt, QThread, pyqtSignal from PyQt6.QtGui import QColor, QTextCharFormat, QTextCursor, QMovie import requests DEEPSEEK_API_URL = "https://api.deepseek.com/v1/chat/completions" class APICallThread(QThread): """用于在后台调用 DeepSeek API 的线程""" finished = pyqtSignal(str) # 用于传递 API 返回的结果 def __init__(self, api_key, messages, model): super().__init__() self.api_key = api_key self.messages = messages self.model = model def run(self): """线程运行逻辑""" headers = { "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json", } data = { "model": self.model, # 使用传入的模型 "messages": self.messages, } try: response = requests.post(DEEPSEEK_API_URL, headers=headers, json=data) response.raise_for_status() # 检查 HTTP 状态码 result = response.json() # 检查 API 返回的数据是否有效 if "choices" not in result or len(result["choices"]) == 0: self.finished.emit("API 返回的数据无效") return self.finished.emit(result["choices"][0]["message"]["content"]) except requests.exceptions.RequestException as e: self.finished.emit(f"请求失败: {str(e)}") except json.JSONDecodeError as e: self.finished.emit(f"API 返回的数据无法解析: {str(e)}") except Exception as e: self.finished.emit(f"未知错误: {str(e)}") class ChatWindow(QMainWindow): def __init__(self): super().__init__() self.history = [] # 存储对话历史 self.init_ui() self.set_api_key("替换为你的 API Key") # 替换为你的 API Key def set_api_key(self, key): self.api_key = key def init_ui(self): self.setWindowTitle("DeepSeek Chat (PyQt6)") self.setGeometry(100, 100, 800, 600) self.setStyleSheet("background-color: #2E3440; color: #D8DEE9;") # 设置窗口背景颜色 # 主布局 central_widget = QWidget() self.setCentralWidget(central_widget) layout = QVBoxLayout(central_widget) layout.setContentsMargins(10, 10, 10, 10) # 设置边距 layout.setSpacing(10) # 设置组件间距 # 模型选择下拉菜单 self.model_selector = QComboBox() self.model_selector.addItem("deepseek-reasoner") self.model_selector.addItem("deepseek-chat") self.model_selector.setStyleSheet( """ QComboBox { background-color: #4C566A; color: #D8DEE9; font-family: Consolas, Courier New; font-size: 14px; border-radius: 5px; padding: 10px; } QComboBox::drop-down { border: none; } """ ) layout.addWidget(self.model_selector) # 对话显示区域 self.chat_display = QTextEdit() self.chat_display.setReadOnly(True) self.chat_display.setStyleSheet( """ QTextEdit { background-color: #3B4252; color: #D8DEE9; font-family: Consolas, Courier New; font-size: 14px; border-radius: 5px; padding: 10px; } """ ) layout.addWidget(self.chat_display) # 输入框 self.input_box = QLineEdit() self.input_box.setPlaceholderText("输入你的问题(支持代码),按 Enter 或点击发送") self.input_box.setStyleSheet( """ QLineEdit { background-color: #4C566A; color: #D8DEE9; font-family: Consolas, Courier New; font-size: 14px; border-radius: 5px; padding: 10px; } """ ) self.input_box.returnPressed.connect(self.send_message) # 绑定回车键 layout.addWidget(self.input_box) # 发送按钮 self.send_button = QPushButton("发送") self.send_button.setStyleSheet( """ QPushButton { background-color: #5E81AC; color: #D8DEE9; font-family: Consolas, Courier New; font-size: 14px; border-radius: 5px; padding: 10px; } QPushButton:hover { background-color: #81A1C1; } """ ) self.send_button.clicked.connect(self.send_message) # 绑定按钮点击 layout.addWidget(self.send_button) # 羊驼动画 self.animation_label = QLabel(self) self.animation_label.setAlignment(Qt.AlignmentFlag.AlignCenter) self.movie = QMovie("C:\\Users\\sy\\PycharmProjects\\qt_1\\OIP-C.gif") self.animation_label.setMovie(self.movie) self.animation_label.hide() # 初始隐藏 self.animation_label.resize(50, 50) # 设置动画标签的大小 layout.addWidget(self.animation_label) def send_message(self): """发送消息并获取 DeepSeek 的回复""" user_input = self.input_box.text().strip() if not user_input: return # 显示用户输入 self.append_message("你", user_input) self.input_box.clear() # 显示羊驼动画 self.animation_label.show() self.movie.start() # 获取当前选择的模型 selected_model = self.model_selector.currentText() # 调用 DeepSeek API(在后台线程中) self.history.append({"role": "user", "content": user_input}) self.api_thread = APICallThread(self.api_key, self.history, selected_model) self.api_thread.finished.connect(self.handle_api_response) self.api_thread.start() def handle_api_response(self, response): """处理 API 返回的响应""" # 停止并隐藏动画 self.movie.stop() self.animation_label.hide() # 显示 DeepSeek 回复 if response: self.append_message("DeepSeek", response) self.history.append({"role": "assistant", "content": response}) def append_message(self, sender, message): """在聊天区域添加消息""" cursor = self.chat_display.textCursor() cursor.movePosition(QTextCursor.MoveOperation.End) # 设置发送者样式 sender_format = QTextCharFormat() sender_format.setForeground(QColor("#88C0D0" if sender == "你" else "#81A1C1")) sender_format.setFontWeight(700) # 加粗 cursor.insertText(f"{sender}:\n", sender_format) # 设置消息样式 message_format = QTextCharFormat() message_format.setForeground(QColor("#D8DEE9")) cursor.insertText(f"{message}\n\n", message_format) # 滚动到底部 self.chat_display.ensureCursorVisible() if __name__ == "__main__": app = QApplication(sys.argv) window = ChatWindow() window.show() sys.exit(app.exec())
直接运行即可,之后你就可以切换使用R1和V3模型。当然也可以打包成exe与朋友分享~不过那样建议先将key做成环境变量什么的,不要硬编码了,如下:
import os
api_key = os.getenv("DEEPSEEK_API_KEY")
如果大家需要的话我也可以直接分享exe
结语:
希望本文对你有所帮助,祝你在构建自己的应用程序时顺利!如果你有任何问题,欢迎在评论区留言。
免责声明:本文中的 API Key 仅供学习和参考使用,请读者自行申请并替换为自己的 API Key,以避免滥用或泄露个人信息。