In the code below, I'm destroying frame1 and frame2, so that the messages can make use of the extra space after destroying frame1 and frame2.
The functionality I need is:
When a message is sent, frame1 and frame2 must get destroyed automatically.
The messages must make use of the extra space but the messages must be below new_note_button.
When new_note_button is clicked, I want all messages to be cleared and frame1, frame2 to appear how it was before.
I tried to recreate frame1 and frame2 when new_note_button is clicked but the frames are in different places and multiple frames are getting created (check the image I've attached).
Here's my code:
import tkinter as tkfrom tkinter import ttkframes_loaded = Truedef clear_chat_log(): global frames_loaded if not frames_loaded: # Create frames to group the boxes frame1 = tk.Frame(root, bg="white") frame1.pack(side=tk.TOP, padx=(0, 40), pady=(100, 1)) frame2 = tk.Frame(root, bg="white") frame2.pack(side=tk.TOP, padx=(0, 40), pady=(5, 20)) style.configure("PDF.TButton", font=('Sans-serif', 12,), background="white", fg="black", highlightthickness=1, highlightbackground="gray", borderwidth=1) chat_with_pdf_button = ttk.Button(frame1, text="Teyxxxxxxxxxxxx", style="PDF.TButton") chat_with_pdf_button.pack(side=tk.LEFT, ipadx=(135), padx=(0, 10), ipady=14) option2_label = tk.Label(frame1, text="testxxxxxxxxxxxxxxxxx", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=95, pady=20) option2_label.pack(side=tk.LEFT) # Create labels for the options in the second frame option3_label = tk.Label(frame2, text="testzzzzzzzzzzzzzzzz", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=116, pady=20) option3_label.pack(side=tk.LEFT, padx=(0, 10)) option4_label = tk.Label(frame2, text="testqqqqqqqqqqqqqqqqq", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=115, pady=20) option4_label.pack(side=tk.LEFT) frames_loaded = True returnroot = tk.Tk()# Adjust the placement of other widgets accordinglyroot.title("Test")# Maximize the windowroot.attributes('-zoomed', True)style = ttk.Style()style.theme_use("clam")chat_frame = tk.Frame(root, bg="white")chat_frame.pack(expand=True, fill=tk.BOTH)chat_log = tk.Text(chat_frame, state='disabled', wrap='word', width=70, height=15, font=('Sans-serif', 12), bg="white", fg="black", highlightthickness=0, borderwidth=0)chat_log.pack(side=tk.LEFT, padx=(500,0), pady=10, expand = True, fill = tk.BOTH)# Create frames to group the boxesframe1 = tk.Frame(root, bg="white")frame1.pack(side=tk.TOP, padx=(0, 40), pady=(100, 1))frame2 = tk.Frame(root, bg="white")frame2.pack(side=tk.TOP, padx=(0, 40), pady=(5, 20))style.configure("PDF.TButton", font=('Sans-serif', 12,), background="white", fg="black", highlightthickness=1, highlightbackground="gray", borderwidth=1)chat_with_pdf_button = ttk.Button(frame1, text="Teyxxxxxxxxxxxx", style="PDF.TButton")chat_with_pdf_button.pack(side=tk.LEFT, ipadx=(135), padx=(0, 10), ipady=14)option2_label = tk.Label(frame1, text="testxxxxxxxxxxxxxxxxx", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=95, pady=20)option2_label.pack(side=tk.LEFT)# Create labels for the options in the second frameoption3_label = tk.Label(frame2, text="testzzzzzzzzzzzzzzzz", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=116, pady=20)option3_label.pack(side=tk.LEFT, padx=(0, 10))option4_label = tk.Label(frame2, text="testqqqqqqqqqqqqqqqqq", font=('Sans-serif', 12,), bg="white", fg="black", highlightthickness=1, highlightbackground="gray", padx=115, pady=20)option4_label.pack(side=tk.LEFT)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'), foreground="black") chat_log.config(state=tk.DISABLED) chat_log.see("end") chat_log.update()def send_message(event=None): global frames_loaded if frame1: frame1.destroy() if frame2: frame2.destroy() frames_loaded = False 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: canvas1.place(x=495,y=80) canvas1.update() append_to_chat_log("User") append_to_chat_log(message=message) append_to_chat_log(message="\n") canvas1.place_forget() canvas1.update()new_note_button = ttk.Button(chat_frame, style="Toggle.TButton", text=" New Note", compound="left", command=clear_chat_log)new_note_button.place(x=490,y=40)canvas1 = tk.Canvas(root, width=250, height=70, bg="white", borderwidth=0, highlightthickness=0)# Display "Loading" textloading_text = canvas1.create_text(70, 50, text="Loading...", anchor="e")message_entry = tk.Text(root, padx=17, insertbackground='white', bg="white", fg="black", 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, "Type")message_entry.mark_set("insert", "%d.%d" % (0,0))message_entry.bind("<Return>", send_message)root.mainloop()
