How do I format markdown chatgpt response in tkinter frame python?

题意:怎样在Tkinter框架中使用Python来格式化Markdown格式的ChatGPT响应?

问题背景:

Chatgpt sometimes responds in markdown language. Sometimes the respond contains ** ** which means the text in between should be bold and ### text ### which means that text is a heading. I want to format this correctly and display it properly in tkinter. If it's bold or a heading, it should be formatted to bold or to a heading in tkintter. How to do this?

ChatGPT有时会以Markdown语言回应。有时回应中包含** **,这表示中间的文本应该是粗体的;而### text ###则表示该文本是一个标题。我想在Tkinter中正确地格式化并显示这些文本。如果它是粗体或标题,则应该在Tkinter中以粗体或标题的形式显示。如何做到这一点?

My code:

import tkinter as tk
from tkinter import ttk
from datetime import datetime
import openai
import json
import requests


history = []
# Create a function to use ChatGPT 3.5 turbo to answer a question based on the prompt
def get_answer_from_chatgpt(prompt, historyxx):
    global history

    openai.api_key = "xxxxxxx"
    append_to_chat_log(message="\n\n\n")
    append_to_chat_log("Chatgpt")

    print("Trying")

    messages = [
            {"role": "user", "content": prompt}
        ]

    try:
        stream = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
            stream=True,
            
        )
        
        for chunk in stream:
            chunk = chunk.choices[0].delta.content
            chunk = str(chunk)
            if chunk != "None":
                append_to_chat_log(message=chunk)
        
        
        append_to_chat_log(message="\n\n\n")
        print("Streaming complete")
               
    except Exception as e:
        print(e)
        return "Sorry, an error occurred while processing your request."

# Create a function to use OpenAI to answer a question based on the search results

def append_to_chat_log(sender=None, message=None):
    chat_log.config(state="normal")
    if sender:
        chat_log.insert("end", f"{sender}:\n", "sender")
    if message:
        chat_log.insert("end", message)
    chat_log.config(state="disabled")
    chat_log.see("end")
    chat_log.update()


def send_message(event=None):
    global history
    message = message_entry.get(1.0, "end-1c") 
    message = message.strip()
    message_entry.delete(1.0, tk.END)
    message_entry.update()
    
    if not message:
        pass 
    else:
              
        append_to_chat_log("User", message)
        history.append(("user", message))
        if len(history) >4:
            history = history[-4:]
        print(message)
        response = get_answer_from_chatgpt(message, history)
        
        history.append(("assistant", response))

root = tk.Tk()

root.title("Chat")

# Maximize the window
root.attributes('-zoomed', True)

chat_frame = tk.Frame(root)
chat_frame.pack(expand=True, fill=tk.BOTH)

chat_log = tk.Text(chat_frame, state='disabled', wrap='word', width=70, height=30, font=('Arial', 12), highlightthickness=0, borderwidth=0)
chat_log.pack(side=tk.LEFT, padx=(500,0), pady=10)

message_entry = tk.Text(root, padx=17, insertbackground='white', width=70, height=1, spacing1=20, spacing3=20, font=('Open Sans', 14))
message_entry.pack(side=tk.LEFT, padx=(500, 0), pady=(0, 70))  # Adjust pady to move it slightly above the bottom
message_entry.mark_set("insert", "%d.%d" % (0,0))
message_entry.bind("<Return>", send_message)

root.mainloop()

问题解决:

I solved my own question        我解决了我自己提出的问题

import tkinter as tk
from datetime import datetime
import openai

history = []

# Create a function to use ChatGPT 3.5 turbo to answer a question based on the prompt
def get_answer_from_chatgpt(prompt, historyxx):
    global history

    openai.api_key = "xxxx"
    append_to_chat_log(message="\n\n\n")
    append_to_chat_log("Chatgpt")

    print("Trying")

    messages = [
            {"role": "user", "content": prompt}
        ]

    try:
        stream = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
            stream=True,
        )
        
        buffer = ""
        heading =  ""
        bold = False
        while True:
            chunk = next(stream)
            chunk = chunk.choices[0].delta.content
            chunk = str(chunk)
            if chunk != "None":
                buffer += chunk
                if "**" in buffer:
                    while "**" in buffer:
                        pre, _, post = buffer.partition("**")
                        append_to_chat_log(message=pre, bold=bold)
                        bold = not bold
                        buffer = post
                if "###" in buffer:
                    while "###" in buffer:
                        pre, _, post = buffer.partition("###")
                        append_to_chat_log(message=pre, bold=heading)
                        heading = not heading
                        buffer = post
                else:
                    append_to_chat_log(message=buffer, bold=bold)
                    buffer = ""
        
        append_to_chat_log(message="\n\n\n")
        print("Streaming complete")
               
    except Exception as e:
        print(e)
        return "Sorry, an error occurred while processing your request."

def append_to_chat_log(sender=None, message=None, bold=False, heading=False):
    chat_log.config(state="normal")
    if sender:
        chat_log.insert("end", f"{sender}:\n", "sender")
    if message:
        if bold:
            chat_log.insert("end", message, "bold")
        if heading:
            chat_log.insert("end", message, "heading")
        else:
            chat_log.insert("end", message)
    chat_log.config(state="disabled")
    chat_log.see("end")
    chat_log.update()

def send_message(event=None):
    global history
    message = message_entry.get(1.0, "end-1c")
    message = message.strip()
    message_entry.delete(1.0, tk.END)
    message_entry.update()
    
    if not message:
        pass 
    else:
        append_to_chat_log("User", message)
        history.append(("user", message))
        if len(history) > 4:
            history = history[-4:]
        print(message)
        response = get_answer_from_chatgpt(message, history)
        history.append(("assistant", response))

root = tk.Tk()
root.title("Chat")

# Maximize the window
root.attributes('-zoomed', True)

chat_frame = tk.Frame(root)
chat_frame.pack(expand=True, fill=tk.BOTH)

chat_log = tk.Text(chat_frame, state='disabled', wrap='word', width=70, height=30, font=('Arial', 12), highlightthickness=0, borderwidth=0)
chat_log.tag_configure("sender", font=('Arial', 12, 'bold'))
chat_log.tag_configure("bold", font=('Arial', 12, 'bold'))
chat_log.tag_configure("heading", font=('Arial', 16, 'bold'))
chat_log.pack(side=tk.LEFT, padx=(500,0), pady=10)

message_entry = tk.Text(root, padx=17, insertbackground='white', width=70, height=1, spacing1=20, spacing3=20, font=('Open Sans', 14))
message_entry.pack(side=tk.LEFT, padx=(500, 0), pady=(0, 70))  # Adjust pady to move it slightly above the bottom
message_entry.mark_set("insert", "%d.%d" % (0,0))
message_entry.bind("<Return>", send_message)

root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/789154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CentOS 6.5配置国内在线yum源和制作openssh 9.8p1 rpm包 —— 筑梦之路

CentOS 6.5比较古老的版本了&#xff0c;而还是有一些古老的项目仍然在使用。 环境说明 1. 更换国内在线yum源 CentOS 6 在线可用yum源配置——筑梦之路_centos6可用yum源-CSDN博客 cat > CentOS-163.repo << EOF [base] nameCentOS-$releasever - Base - 163.com …

ChatGLM-6B入门

ChatGLM-6B ChatGLM-6B 一、介绍 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最…

数据结构(初阶1.复杂度)

文章目录 一、复杂度概念 二、时间复杂度 2.1 大O的渐进表示法 2.2 时间复杂度计算示例 2.2.1. // 计算Func2的时间复杂度&#xff1f; 2.2.2.// 计算Func3的时间复杂度&#xff1f; 2.2.3.// 计算Func4的时间复杂度&#xff1f; 2.2.4.// 计算strchr的时间复杂度&#xff1f; …

智能车载防窒息系统设计

摘要 随着汽车行业的快速发展&#xff0c;车辆安全问题越来越受到人们的关注。其中&#xff0c;车载防窒息系统是一项重要的安全设备。本论文基于STM32单片机&#xff0c;设计了一种智能车载防窒息系统。该系统主要包括氧气浓度检测模块、温湿度检测模块、声音检测模块、光线检…

URPF简介

定义 URPF&#xff08;Unicast Reverse Path Forwarding&#xff09;是单播逆向路径转发的简称&#xff0c;其主要功能是防止基于源IP地址欺骗的网络攻击行为。 目的 拒绝服务DoS&#xff08;Denial of Service&#xff09;攻击是一种阻止连接服务的网络攻击。DoS的攻击方式…

QT开发积累——qt中的注释和多行注释的几种方式,函数方法注释生成

目录 引出qt中的注释和多行注释方法的注释生成 总结日积月累&#xff0c;开发集锦方法参数加const和不加const的区别方法加static和不加static的区别Qt遍历list提高效率显示函数的调用使用&与不使用&qt方法的参数中使用&与不使用&除法的一个坑 项目创建相关新建…

交通气象站:保障道路安全的智慧之眼

随着社会的快速发展&#xff0c;交通运输日益繁忙&#xff0c;道路安全成为公众关注的焦点。在这个背景下&#xff0c;交通气象站作为保障道路安全的重要设施&#xff0c;正发挥着越来越重要的作用。它们不仅为交通管理部门提供及时、准确的气象信息&#xff0c;也为广大驾驶员…

Conformal low power-2.电源感知等效性检查

电源感知等效性检查 ■ 第24页&#xff1a;电源感知等效性检查概述 ■ 第24页&#xff1a;启动低功耗&#xff08;等效性检查&#xff09;软件 ■ 第25页&#xff1a;电源感知等效性检查流程 ■ 第28页&#xff1a;电源感知等效性检查示例Do文件 电源感知等效性检查概述…

【网络安全科普】网络安全指南请查收

随着社会信息化深入发展&#xff0c;互联网对人类文明进步奖发挥更大的促进作用。但与此同时&#xff0c;互联网领域的问题也日益凸显。网络犯罪、网络监听、网络攻击等是又发生&#xff0c;网络安全与每个人都息息相关&#xff0c;下面&#xff0c;一起来了解网络安全知识吧。…

从零到一:打造你的专属AI聊天机器人之旅

在这个智能技术日新月异的时代&#xff0c;AI聊天机器人已成为我们日常生活中不可或缺的伙伴&#xff0c;从客服咨询到情感交流&#xff0c;它们以独特的魅力融入了我们的每一个角落。你是否也曾梦想过亲手创造一个能够理解你、陪伴你的AI聊天机器人呢&#xff1f;今天&#xf…

After Detailer让图像自动修复

After Detailer&#xff08;简称adetailer&#xff09;是一个Stable Diffusion的自动Web-UI扩展&#xff0c;它能够自动化修复图像中的不完整部分&#xff0c;例如模糊的人脸等常见问题。在这篇文章中&#xff0c;你将了解它的工作原理、如何使用它&#xff0c;以及一些常见的使…

CSDN回顾与前行:我的创作之旅——2048天的技术成长与感悟

CSDN回顾与前行&#xff1a;我的创作之旅——2048天的技术成长与感悟 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 前言 时光荏苒&#xff0c;岁月如梭。转眼间&#xff0c;从我在CSDN上写下第一篇技术博客《2-6 带头结点的链式表操作集…

无线网的ip地址固定吗

在数字化日益普及的今天&#xff0c;无线网络已成为我们生活与工作中不可或缺的一部分。然而&#xff0c;对于许多非专业用户来说&#xff0c;无线网络背后的技术细节仍然充满了神秘感。其中&#xff0c;一个常见的问题是&#xff1a;无线网的IP地址是固定的吗&#xff1f;本文…

WebKit简介及其神秘的工作流程

在信息时代的巨浪中&#xff0c;互联网已经深深地渗透到了我们生活的每一个角落。作为连接我们与这个庞大网络世界的桥梁&#xff0c;网页浏览器无疑成为了我们生活中不可或缺的一部分。而在这些浏览器的背后&#xff0c;往往隐藏着一些强大而神秘的引擎&#xff0c;它们为浏览…

【源码+文档+调试讲解】沙县小吃点餐系统

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 沙县小吃点餐系统&#xff0c;主要的模块包括实现管理员&#xff1b;个人中心、用户管理、小吃信息管理、门店信息管理、预约信息管理、系统管…

Windows 网络重置及重置网络可能出现的问题( WIFI 没有了 / WLAN 图标消失)

netsh int ip reset 命令是用于重置 Windows 操作系统中的网络设置和配置的命令。 在网络故障排除、修复网络连接问题以及清除可能存在的网络配置冲突时非常有用。 命令详解&#xff1a; netsh: 用于配置各种网络设置 int: 用于管理网络接口 ip: 用于管理网络接口的 IP 配…

酒库温度看板软件设计

摘要 随着酒类行业的发展&#xff0c;酒库的管理变得越来越重要。酒库是存放酒类产品的地方&#xff0c;其温度对酒类产品的质量和口感有着至关重要的影响。因此&#xff0c;监控和控制酒库温度是酒库管理的重要环节。 本论文针对酒库温度监测与管理的需求&#xff0c;设计了一…

GeoServer property 表达式注入代码执行漏洞(CVE-2024-36401)

GeoServer property 表达式注入代码执行漏洞(CVE-2024-36401) 1.漏洞描述 GeoServer 是一个开源的服务器软件&#xff0c;使用 Java 编写&#xff0c;主要功能是允许用户共享和编辑地理空间数据。它在设计时就考虑到了互操作性&#xff0c;支持使用开放标准来发布多种主流格式…

从数据仓库到数据湖(下):热门的数据湖开源框架

文章目录 一、前言二、Delta Lake三、Apache Hudi四、Apache Iceberg五、Apache Paimon六、对比七、笔者观点八、总结八、参考资料 一、前言 在上一篇从数据仓库到数据湖(上)&#xff1a;数据湖导论文章中&#xff0c;我们简单讲述了数据湖的起源、使用原因及其本质。本篇文章…

强化学习总结(有具体代码实现)

文章目录 第一部分 强化学习基础第1章 强化学习概述1.1 强化学习概念1.2 强化学习的环境1.3 强化学习的目标1.4 强化学习的数据 第2章 多臂老虎机问题&#xff08;MAB问题&#xff09;2.1 问题描述2.1.1 问题定义2.1.2 形式化描述2.1.3 累积懊悔2.1.4 估计期望奖励 2.2 解决方法…