import tkinter as tk from tkinter import Canvas, Frame, Scrollbar, Label, Entry, BOTH, RIGHT, LEFT, Y, NW from predict import chatbot_response class ChatbotGUI: def __init__(self, root): self.root = root self.root.title("LMS Chatbot") self.root.geometry("500x600") self.root.minsize(400, 400) self.root.configure(bg="#f0f0f0") # Chat frame with canvas for scrolling self.frame = Frame(root, bg="#f0f0f0") self.frame.pack(padx=10, pady=10, fill=BOTH, expand=True) self.canvas = Canvas(self.frame, bg="#f0f0f0", highlightthickness=0) self.scrollbar = Scrollbar(self.frame, orient="vertical", command=self.canvas.yview) self.scrollable_frame = Frame(self.canvas, bg="#f0f0f0") self.scrollable_frame.bind( "", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")) ) self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor=NW) self.canvas.configure(yscrollcommand=self.scrollbar.set) self.canvas.pack(side=LEFT, fill=BOTH, expand=True) self.scrollbar.pack(side=RIGHT, fill=Y) # Entry box self.entry = Entry(root, font=("Helvetica", 14), bd=2, relief="groove") self.entry.pack(padx=10, pady=10, fill="x") self.entry.bind("", self.send_message) # Typing indicator self.typing_label = Label(root, text="", bg="#f0f0f0", fg="gray", font=("Helvetica", 10)) self.typing_label.pack(pady=(0,5)) def send_message(self, event): user_input = self.entry.get().strip() if not user_input: return self.entry.delete(0, tk.END) self.add_message(user_input, sender="user") self.typing_label.config(text="Bot is typing...") self.root.after(500, lambda: self.bot_reply(user_input)) def bot_reply(self, user_input): response = chatbot_response(user_input) self.typing_label.config(text="") self.animate_bot_response(response) def add_message(self, message, sender="bot"): bubble = Label(self.scrollable_frame, text=message, wraplength=300, justify="left", bg="#DCF8C6" if sender=="user" else "#FFFFFF", fg="#000000", font=("Helvetica", 12), padx=10, pady=5, bd=1, relief="solid") bubble.pack(anchor="e" if sender=="user" else "w", pady=5, padx=5) self.canvas.update_idletasks() self.canvas.yview_moveto(1.0) def animate_bot_response(self, text, idx=0, message=""): if idx < len(text): message += text[idx] if hasattr(self, "bot_bubble"): self.bot_bubble.config(text=message) else: self.bot_bubble = Label(self.scrollable_frame, text=message, wraplength=300, justify="left", bg="#FFFFFF", fg="#000000", font=("Helvetica", 12), padx=10, pady=5, bd=1, relief="solid") self.bot_bubble.pack(anchor="w", pady=5, padx=5) idx += 1 self.root.after(30, self.animate_bot_response, text, idx, message) else: del self.bot_bubble self.canvas.update_idletasks() self.canvas.yview_moveto(1.0) if __name__ == "__main__": root = tk.Tk() app = ChatbotGUI(root) root.mainloop()