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("", 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("", send_message)
root.mainloop()
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

