跳到主要内容
Python Tkinter 集成 DocsGPT 本地 API 开发实践 | 极客日志
Python AI
Python Tkinter 集成 DocsGPT 本地 API 开发实践 综述由AI生成 基于 Python Tkinter 开发的一个集成 AI 助手的本地代码编辑器。项目实现了代码编辑、文件管理、代码运行调试以及 GPT 智能问答功能。系统支持同时调用 OpenAI 官方 API 和本地部署的 DocsGPT API,通过 SQLite 数据库存储提问历史和代码片段。界面采用左右分栏设计,支持深浅色主题切换,具备完整的错误处理和连接测试机制,适合用于辅助 Python 学习和开发。
栈溢出 发布于 2026/4/6 更新于 2026/5/22 31 浏览Python Tkinter 集成 DocsGPT 本地 API 开发实践
本文介绍如何使用 Python 和 Tkinter 构建一个集成代码编辑器与 GPT 助手的本地 IDE,支持调用本地 DocsGPT API 及 OpenAI 官方 API。
项目结构
gpt_code_ide/
├── main.py
├── database.py
├── gpt_client.py
└── requirements.txt
1. 依赖配置 (requirements.txt)
tkinter
sqlite3
requests
pygments
idlelib
2. 数据库模块 (database.py)
负责管理 SQLite 数据库,存储提问历史、代码片段及用户设置。
import sqlite3
import json
from datetime import datetime
from typing import List , Dict , Optional
class PyAIDatabase :
def __init__ (self, db_name: str = "pyai.db" ):
self .db_name = db_name
self .init_database()
def init_database (self ):
with sqlite3.connect(self .db_name) as conn:
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS query_history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
question TEXT NOT NULL,
answer TEXT NOT NULL,
code_context TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""" )
cursor.execute( )
cursor.execute( )
cursor.execute( )
conn.commit()
( ) -> :
sqlite3.connect( .db_name) conn:
cursor = conn.cursor()
cursor.execute( , (question, answer, code_context))
conn.commit()
cursor.lastrowid
( ) -> [ ]:
sqlite3.connect( .db_name) conn:
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute( , (limit, offset))
rows = cursor.fetchall()
[ (row) row rows]
( ) -> :
sqlite3.connect( .db_name) conn:
cursor = conn.cursor()
cursor.execute( , (query_id,))
conn.commit()
cursor.rowcount >
( ) -> :
sqlite3.connect( .db_name) conn:
cursor = conn.cursor()
cursor.execute( )
conn.commit()
cursor.rowcount >
( ) -> [ ]:
sqlite3.connect( .db_name) conn:
conn.row_factory = sqlite3.Row
cursor = conn.cursor()
cursor.execute( , ( , ))
[ (row) row cursor.fetchall()]
db = PyAIDatabase()
"""
CREATE TABLE IF NOT EXISTS code_snippets (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
code TEXT NOT NULL,
language TEXT DEFAULT 'python',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
"""
"""
CREATE TABLE IF NOT EXISTS settings (
key TEXT PRIMARY KEY,
value TEXT NOT NULL
)
"""
"""
INSERT OR IGNORE INTO settings (key, value)
VALUES ('api_key', ''), ('api_url', 'https://api.openai.com/v1/chat/completions'), ('theme', 'light'), ('font_size', '12')
"""
def
save_query
self, question: str , answer: str , code_context: Optional [str ] = None
int
with
self
as
"""INSERT INTO query_history (question, answer, code_context) VALUES (?, ?, ?)"""
return
def
get_query_history
self, limit: int = 50 , offset: int = 0
List
Dict
with
self
as
"""SELECT id, question, answer, code_context, created_at, updated_at FROM query_history ORDER BY created_at DESC LIMIT ? OFFSET ?"""
return
dict
for
in
def
delete_query
self, query_id: int
bool
with
self
as
"DELETE FROM query_history WHERE id = ?"
return
0
def
clear_history
self
bool
with
self
as
"DELETE FROM query_history"
return
0
def
search_history
self, keyword: str
List
Dict
with
self
as
"""SELECT id, question, answer, created_at FROM query_history WHERE question LIKE ? OR answer LIKE ? ORDER BY created_at DESC"""
f"%{keyword} %"
f"%{keyword} %"
return
dict
for
in
3. GPT API 客户端 (gpt_client.py) 支持 OpenAI 和 DocsGPT 两种 API 类型,处理同步/异步调用及流式响应。
import requests
import json
from typing import Optional , Dict , Any
import threading
from database import db
class GPTClient :
def __init__ (self, api_key: str = None , api_url: str = None ):
self .api_key = api_key or db.get_setting('api_key' ) or ""
self .api_url = api_url or db.get_setting('api_url' ) or "https://api.openai.com/v1/chat/completions"
self .session = requests.Session()
self .session.headers.update({
"Authorization" : f"Bearer {self.api_key} " ,
"Content-Type" : "application/json"
})
def set_api_key (self, api_key: str ):
self .api_key = api_key
self .session.headers.update({"Authorization" : f"Bearer {api_key} " })
db.update_setting('api_key' , api_key)
def set_api_url (self, api_url: str ):
self .api_url = api_url
db.update_setting('api_url' , api_url)
def ask_question (self, question: str , code_context: Optional [str ] = None , model: str = "gpt-3.5-turbo" , max_tokens: int = 1000 , temperature: float = 0.7 , callback=None ) -> Optional [str ]:
if not self .api_key:
return "错误:请先设置 API 密钥"
messages = []
if code_context:
messages.append({
"role" : "system" ,
"content" : f"以下是相关代码上下文:\n```python\n{code_context} \n```\n请基于此代码上下文回答问题。"
})
messages.append({"role" : "user" , "content" : question})
data = {
"model" : model,
"messages" : messages,
"max_tokens" : max_tokens,
"temperature" : temperature,
"stream" : False
}
try :
if callback:
thread = threading.Thread(target=self ._async_ask, args=(data, callback))
thread.daemon = True
thread.start()
return "正在处理..."
else :
return self ._sync_ask(data)
except Exception as e:
return f"请求错误:{str (e)} "
def _async_ask (self, data: Dict , callback ):
try :
response = self .session.post(self .api_url, json=data, timeout=30 )
if response.status_code == 200 :
result = response.json()
answer = result['choices' ][0 ]['message' ]['content' ]
callback(answer)
else :
error_msg = f"API 错误:{response.status_code} \n{response.text} "
callback(error_msg)
except requests.exceptions.Timeout:
callback("错误:请求超时,请检查网络连接" )
except requests.exceptions.ConnectionError:
callback("错误:无法连接到 API 服务器" )
except Exception as e:
callback(f"未知错误:{str (e)} " )
def _sync_ask (self, data: Dict ) -> str :
try :
response = self .session.post(self .api_url, json=data, timeout=30 )
if response.status_code == 200 :
result = response.json()
return result['choices' ][0 ]['message' ]['content' ]
else :
return f"API 错误:{response.status_code} \n{response.text} "
except requests.exceptions.Timeout:
return "错误:请求超时,请检查网络连接"
except requests.exceptions.ConnectionError:
return "错误:无法连接到 API 服务器"
except Exception as e:
return f"未知错误:{str (e)} "
gpt_client = GPTClient()
4. 主 GUI 程序 (main.py) 使用 Tkinter 构建左右分栏界面,左侧为代码编辑器,右侧为 GPT 助手。
(注:此处省略大量 GUI 布局代码,核心逻辑包括主题切换、文件操作、代码运行及问答交互)
CodeEditor : 代码编辑区,支持语法高亮、文件保存、查找替换。
GPTAssistant : 问答区,支持 API 配置、问题输入、答案显示及历史记录查询。
PythonIDE : 主窗口,整合菜单、工具栏及事件绑定。
使用说明 步骤 操作 安装依赖 pip install requests autopep8启动服务 在 DocsGPT 目录中运行 python app.py 或 npm start 配置 API 在程序右侧输入框填写 API 密钥,选择 API 类型为 docsgpt 或 openai 测试连接 点击'测试连接'验证本地 DocsGPT 服务 (http://localhost:3001/api/answer) 运行代码 编写 Python 代码后点击'运行代码'按钮执行 提问助手 在右侧输入问题,勾选'包含代码上下文'后获取答案
功能特点
双 API 支持 : 兼容 OpenAI 官方 API 和本地 DocsGPT API。
历史记录 : 基于 SQLite 持久化存储问答记录,支持搜索。
界面优化 : 支持浅色/深色主题切换,海蓝色主题按钮。
代码执行 : 内置临时文件机制安全运行 Python 代码并捕获输出。
兼容性 : 自动适应不同的响应格式,提供详细的错误信息。
相关免费在线工具 RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
随机西班牙地址生成器 随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online