You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python的Tkinter框架中流式展示GPT-3.5完整响应?

解决Tkinter中流式展示GPT-3.5响应时Chunk换行问题

问题核心是每次流式返回的chunk被单独添加了换行符,导致内容碎片化。只需调整文本插入逻辑,去掉chunk级别的换行,改为在完整响应结束后统一添加换行即可。

核心修改思路

  • 移除每次插入chunk时附加的换行符,直接拼接文本内容
  • 流式响应全部结束后,手动添加换行区分不同对话轮次
  • 维护对话历史,确保后续请求能基于完整上下文交互

修正后的完整代码示例

import tkinter as tk
import openai

# 配置OpenAI API密钥(替换为你的密钥)
openai.api_key = "your-api-key-here"

# 初始化对话历史
messages = [{"role": "system", "content": "你是一个友好的AI助手"}]

def stream_response():
    global messages
    user_input = input_box.get("1.0", tk.END).strip()
    if not user_input:
        return
    
    # 添加用户消息到聊天框和对话历史
    chat_box.insert(tk.END, f"用户: {user_input}\n")
    messages.append({"role": "user", "content": user_input})
    input_box.delete("1.0", tk.END)
    
    # 标记AI消息的起始位置,用于后续提取完整响应
    ai_start_pos = chat_box.index(tk.END)
    chat_box.insert(tk.END, "AI: ")
    
    # 发起流式请求
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages,
        stream=True
    )
    
    for chunk in response:
        content = chunk['choices'][0]['delta'].get('content', '')
        if content:
            # 直接追加chunk内容,不添加换行
            chat_box.insert(tk.END, content)
            chat_box.update_idletasks()
            # 自动滚动到最新内容
            chat_box.see(tk.END)
    
    # 流式结束后添加换行,分隔下一轮对话
    chat_box.insert(tk.END, '\n')
    
    # 提取完整AI响应并加入对话历史
    full_ai_response = chat_box.get(ai_start_pos, tk.END).strip().replace("AI: ", "")
    messages.append({"role": "assistant", "content": full_ai_response})

# 创建Tkinter界面
root = tk.Tk()
root.title("GPT-3.5 流式聊天窗口")

# 聊天显示框
chat_box = tk.Text(root, wrap=tk.WORD, state=tk.NORMAL)
chat_box.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)

# 输入框
input_box = tk.Text(root, height=4)
input_box.pack(fill=tk.X, padx=10, pady=(0,10))

# 发送按钮
send_btn = tk.Button(root, text="发送", command=stream_response)
send_btn.pack(pady=(0,10))

root.mainloop()

关键修改点说明

  1. 移除chunk级换行:删除原代码中insert(END, content + '\n')的+ '\n',确保每个chunk直接拼接到上一段内容后
  2. 统一添加对话分隔符:在所有chunk接收完成后,才插入一个换行符,区分用户消息和AI消息的不同轮次
  3. 自动滚动优化:添加chat_box.see(tk.END),确保新内容出现时聊天框自动滚动到底部
  4. 完整响应收集:通过文本索引ai_start_pos提取完整的AI响应,保证对话历史的准确性

内容的提问来源于stack exchange,提问作者noocoder777

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 05:41:20