Как сделать текст жирным и оставить пробел между ними в tkinter python?

В моем коде я хочу выделить только имя отправителя жирным шрифтом. Это означает, что я хочу выделить жирным шрифтом только слова «Пользователь» и «Gpt-3.5-turbo». По какой-то причине сообщения, отправленные «Пользователем», всегда выделяются жирным шрифтом. Кроме того, между «Пользователем» и «Gpt-3.5-турбо» нет новой строки, как видно на прикрепленном мной изображении, хотя между самым первым сообщением «Пользователь» и «Gpt-3.5-турбо» есть пространство. ". Я пробовал много команд, чтобы решить эту проблему, но безуспешно. Может ли кто-нибудь помочь мне решить эти две проблемы? Ниже мой код:

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, history):
    openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    print("Trying")

    messages = [
            {"role": "system", "content": "You are a helpful assistant."}
        ]

    for sender, message in history:
            messages.append({"role": sender, "content": message})

    try:
        stream = openai.chat.completions.create(
            model = "gpt-3.5-turbo",
            messages=messages,
            stream=True,
            
        )
        append_to_chat_log("Gpt-3.5-turbo")
        for chunk in stream:
            if chunk.choices[0].delta.content is not None:
               chunk = chunk.choices[0].delta.content
               append_to_chat_log(message=chunk) 
               #history.append(("assistant", chunk))
        append_to_chat_log(message = "\n")
        
        #chat_log.insert("end",'\n\n')
        
        print("Streamig 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):
   
    chat_log.config(state=tk.NORMAL)
    if sender:
        chat_log.insert("end", f"{sender}\n\n", "sender")
        
        #chat_log.insert("end",'\n\n')
    if message:
        chat_log.insert("end", message)
    chat_log.tag_config("sender", font=('Arial', 12, 'bold'))
    chat_log.config(state=tk.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")
        append_to_chat_log(message)
        history.append(("user", message))
        if len(history) >4:
            history = history[-4:]

        get_answer_from_chatgpt(message, history)
        print(history)

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.insert(0, "Ask me anything...")
message_entry.insert(1.0, "Ask me anything...")
message_entry.mark_set("insert", "%d.%d" % (0,0))
message_entry.bind("<Return>", send_message)
#message_entry.bind("<Button-1>", click)

root.mainloop()

Я пробовал использовать такие команды, как chat_log.insert("end",'\n\n') и append_to_chat_log(message = "\n"), в функции def get_answer_from_

tkinter использует tags, который вам нужно назначить для добавления текста, а позже вы сможете назначить разные стили (жирный, цвет и т. д.) разным тегам. Я думаю, что эта проблема была несколько раз при переполнении стека.
furas 11.04.2024 11:45

python — Теги в текстовом виджете — tkinter — 2 Ответа

furas 11.04.2024 11:49

возможно, в исходном тексте уже есть new lines, и вам придется удалить их с помощью text = text.strip()

furas 11.04.2024 11:50

Возможно, сначала используйте print()print(type(...)), print(len(...)) и т. д.), чтобы увидеть, какая часть кода выполняется и что на самом деле у вас есть в переменных. Он называется "print debuging" и помогает увидеть, что на самом деле делает код.

furas 11.04.2024 11:51
Почему в 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
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Сообщение от пользователя выделено жирным шрифтом, потому что вы неправильно набрали append_to_chat_log() в сообщении, и вам нужно использовать опцию message, как показано ниже:

def send_message(event=None):
    ...
    else:
        append_to_chat_log("User")  # log the sender
        append_to_chat_log(message=message)  # log the message
        ...

Чтобы добавить символы новой строки между сообщениями, вы можете добавлять сообщения новой строки до и после ответа GPT:

def get_answer_from_chatgpt(message, history):
    ...
    try:
        ...
        # add newlines before response
        append_to_chat_log(message = "\n\n")
        append_to_chat_log("Gpt-3.5-turbo")
        for chunk in stream:
            ...
        # add newlines after response
        append_to_chat_log(message = "\n\n")
        ...
    ...

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