top of page

Welcome
to NumpyNinja Blogs

NumpyNinja: Blogs. Demystifying Tech,

One Blog at a Time.
Millions of views. 

Making a Chatbot with Tkinter (aka me fumbling through Python GUIs)

May 1, 2025
4 min read

Why I Even Bothered


So, I had this basic Python chatbot running in the terminal. Cool, right? But it felt kind of... meh. It talked, but looked like a command-line fossil. I wanted something more fun — something with buttons I could click and text I could actually see like a real chat app.


That’s when I heard about Tkinter. Apparently, it’s Python’s built-in way to make desktop apps. I hadn’t touched GUI stuff before — didn’t even know what “widgets” meant — but hey, figured I’d give it a shot.


Spoiler: totally worth it.


 What I Wanted to Build (Nothing Too Crazy)


The plan was simple:-


  • A window (because, duh)

  • A chat log that scrolls

  • A box to type into

  • A 'Send' button

  • Bot replies show up underneath


No AI wizardry here. Just wanted a Python app that felt more interactive.


Setting Up Tkinter (Turns Out It's Already There?)


Good news: Tkinter usually comes with Python. Seriously. No pip installs, no virtualenvs.


To check, just open your Python shell and type:


import tkinter as tk

print(tk.TkVersion)


If it gives you a version number, you’re set.


 Let’s Build It – Step by Step (And Yes, It Actually Works)


After a few weird layout bugs and text overlaps, I finally got it working. Not perfect, but hey — it runs!


Here’s the code:


import tkinter as tk

from tkinter import scrolledtext

import re


# my mini-reply system

def come_up_with_reply(msg):

    m = msg.lower().strip()

    

    if re.search(r'\b(hi|hello|hey)\b', m):

        return "Hey hey! 😄"

    elif "how are you" in m or "how’s it going" in m:

        return "Meh, I’m doing my thing. You?"

    elif "bye" in m or "see you" in m:

        return "Catch ya later "

    elif "help" in m:

        return "Hmm. Maybe try typing something like: hi / how are you / bye"

    else:

        return "Didn't quite catch that. Try again maybe?"


# when the user hits Send

def fire_send():

    typed_text = entry_input.get()

    if not typed_text.strip():

        return


    chat_area.config(state='normal')

    chat_area.insert(tk.END, "\nYou: " + typed_text, "me")


    answer = come_up_with_reply(typed_text)

    chat_area.insert(tk.END, "\nBot: " + answer + "\n", "bot")


    chat_area.config(state='disabled')

    entry_input.delete(0, tk.END)

    chat_area.yview(tk.END)  # always scroll down


# app setup

app = tk.Tk()

app.title("Old School Chat ")

app.geometry("425x537")

app.configure(bg="#ccddee")  # yeah, just picked a pastel shade


# header at the top

top_banner = tk.Label(app, text="ChatBuddy Console", font=("Arial", 14),

                      bg="#445566", fg="#ffffff", pady=7)

top_banner.pack(fill="x")


# chat history box

chat_area = scrolledtext.ScrolledText(app,

    wrap=tk.WORD,

    state='disabled',

    font=("Lucida Console", 11),

    bg="#fefefe", fg="#333333"

)

chat_area.tag_config("me", foreground="#003366", font=("Arial", 11, "bold"))

chat_area.tag_config("bot", foreground="#7b1fa2", font=("Arial", 10, "italic"))  # TODO: try another font?

chat_area.pack(padx=13, pady=(11, 5), fill=tk.BOTH, expand=True)


# entry + send

entry_wrap = tk.Frame(app, bg="#ccddee")

entry_wrap.pack(fill=tk.X, padx=10, pady=12)


entry_input = tk.Entry(entry_wrap, font=("Georgia", 12), bd=3)

entry_input.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0, 8))


send_button = tk.Button(entry_wrap, text="Send It", command=fire_send,

                        bg="#6d1b7b", fg="white", font=("Arial", 10, "bold"),

                        padx=10, pady=5)

send_button.pack(side=tk.RIGHT)


# blast off

app.mainloop()





 What It Does (and What It Totally Doesn’t)


What this little app can do:


- Show a GUI

- Display a back-and-forth convo

- React to some keywords

- Feel interactive


But it’s not an actual AI. It’s just rule-based.


Where to Go From Here


- Hook it up to OpenAI’s API

- Try customtkinter for prettier widgets

- Store replies in a CSV or JSON file

- Add features like avatars or sound effects


Wrapping Up


This whole thing started out kind of randomly — just me messing around on a weekend. I didn’t expect much, but I actually got a working GUI chatbot out of it. I picked up a bunch of stuff about Tkinter along the way too.


If you’re still figuring out Python and want to make your code feel like a “real” app, I’d say give this kind of project a go. Seriously — it’s way more fun than just printing stuff in the terminal.


Why GUIs Matter (Especially for Beginners)


It’s similar to the difference between testing a car engine in a garage and actually driving it on the road.


 The Layout Struggles Are Real


One thing I definitely underestimated? Getting the layout to behave. Between frames, padding, fill options, and widget stacking, I spent more time rearranging buttons than writing bot replies. My advice: start with a pencil sketch of your layout. Seriously. Even a doodle helps you visualize where things should go.


Also, don't be afraid to just break your app and start over. I had at least three 'final versions' before landing on something that worked.


 Behind the Scenes: Event Binding


Take the 'Send' button, for example. When you click it, it calls a function I wrote (`on_send`). That function takes whatever was typed, figures out a reply, and then updates the chat window. That kind of connection — between action and response — is a big part of GUI building.


 Little Things That Made a Big Difference


- Adding emojis made the interface more fun and less robotic.

- Color-coded text helped me instantly recognize who was talking.

- Disabling the chat box after writing to it made it feel more like a real log.

- Using `ScrolledText` instead of a regular `Text` widget saved me from writing my own scroll logic.


 Ideas to Customize Further


Want to keep going? Here are some ideas that might take your chatbot to the next level:


- Add a settings panel to switch between light and dark themes.

- Include a chatbot name and avatar for personality.

- Let users pick predefined questions with buttons (think quick replies).

- Save the conversation log to a text file for later reference.

- Use regex or keyword mapping to expand the bot's range of understanding.

 
 

+1 (302) 200-8320

NumPy_Ninja_Logo (1).png

Numpy Ninja Inc. 8 The Grn Ste A Dover, DE 19901

© Copyright 2025 by Numpy Ninja Inc.

  • Twitter
  • LinkedIn
bottom of page