Как отформатировать ответ уценки Chatgpt в Python Frame tkinter?

Как это сделать?

Мой код:

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


history = []
# Create a function to use 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()

Этот вопрос похож на: Как показать текст в формате уценки в tkinter?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Andrew Yim 07.07.2024 16:03

Похоже, мне придется исправить это вручную, получая каждое передаваемое сообщение и проверяя, существует ли **, а затем выделяя все жирным шрифтом, пока не найдет закрывающее **. То же самое и с заголовками. Подобный вопрос, указанный в разделе комментариев, очень устарел, и библиотека больше не существует.

noocoder777 08.07.2024 15:34

Решение, предоставленное idbrii в связанном вопросе, является примером, на который вы можете ссылаться.

acw1668 08.07.2024 17:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
92
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил свой вопрос

import tkinter as tk
from datetime import datetime
import openai

history = []

# Create a function to use 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()

Другие вопросы по теме