Creating a Chatbot using Python Tkinter GUI toolkit

Creating a Chatbot using Python Tkinter GUI toolkit

Chatbot is a software application that simulates human conversation through text or voice. They are created to answer FAQs (Frequently Asked Questions), provide full-time support to customers, handle inquiries, and reach out to agents for further support on issues that require human intervention.

In this project, I will show you how to create a Python chatbot powered by the Tkinter GUI (Graphical User Interface) toolkit. This chatbot will handle inquiries and answer questions on the DevOps Engineering Field.

Setting up the Environment

  • Install Python on your operating system by following these steps here

  • Install Tkinter by running this command on your bash/ VS Code terminal

pip install tk

  • Create a folder and name it Chatbot

  • Open the folder with VS Code

  • Create a Python file and call it Chatbot.py

Designing the User Interface

For convenient User interactions with the chatbot, consider designing a simple Graphical User Interface like this one.

To achieve the above layout, you need to import the necessary libraries and put your code in order as follows:

Importing the necessary libraries

from tkinter import *
import tkinter as tk
from tkinter import PhotoImage
from tkinter import Label, Tk
from PIL import Image, ImageTk
import datetime

Create a date and time function to greet the client as per visiting time.

# greetings based on time opening chatbot
current_time = datetime.datetime.now()

if 6 <= current_time.hour <= 12:
    greeting = "Good Morning!"
elif 12 <= current_time.hour <= 16:
    greeting = "Good Afternoon!"
else:
    greeting = "Good Evening!"

Create the main Tkinter GUI based on your size, color, and font.

# Tkinter UI/UX design
root=Tk()
root.title('DevOps Chatbot')
root.geometry('720x400+150+100')
root.configure(bg='light blue')
root.resizable(False, False)

Create the heading of the chatbot

# Heading label to inform the user what to do
heading = Label(root, text=f"{greeting} 😄. I'm DevOps Chatbot. I have DevOps answers for you from the drop-down menu.", fg='#000', bg='white', font=('Microsoft YaHei UI Light', 10, 'bold'))
heading.place(x=10, y=5)

After the heading, there is the dropdown menu. Design appropriately adding necessary questions that the users are interested in or may ask. Write the questions as precisely as possible because they will fetch data from a JSON file.

# Dropdown Menu for the user to select
dropdown = tk.StringVar()
dropdown.set("Select a response")
dropdown_menu = tk.OptionMenu(root, dropdown, "What is DevOps", "DevOps Principles", "Benefits of adopting DevOps", "DevOps Career Paths", "DevOps Tools", "Learning Resources")
dropdown_menu.grid(row=1, column=0, padx=100, pady=100)
dropdown_menu.place(x=10, y=40)
dropdown_menu.config(width=70)

Create an area where answers will be displayed

#This is where the user answers will be displayed
chat_history = Text(root, fg='black', border=2, bg='white', height=17, width=57, font=("cambria", 11))
chat_history.place(x=10, y=90)

Create necessary buttons for navigation and interaction with the chatbot.

This Chatbot will have three buttons

The Click for answers button will display answers corresponding to the selection of the question.

The Clear Screen button will clear all the data in the chat area.

The Close Window button will close the chatbot.

The following code shows how to design the buttons.

# Button to ask the question
ask = Button(root, width=25, pady=7, text="Click for Answers", fg='black').place(x=500, y=90)

# Button to clear the screen
clear = Button(root, width=25, pady=7, text="Clear Screen", fg='black')
clear.place(x=500, y=150)

# Button to exit the chatbot
exit = Button(root, width=25, pady=7, text="Close Window", fg='black')
exit.place(x=500, y=210)

Displaying DevOps image

Download the image and copy it to your current directory

Resize the image to specific dimensions as you may need.

Set the place to display your image.

# Open the image using Pillow
pil_img = Image.open('devops.png')

# Resize the image to specific dimensions (adjust width and height as needed)
width, height = 180, 110
pil_img = pil_img.resize((width, height), Image.BICUBIC)

# Convert Pillow image to Tkinter-compatible format
tk_img = ImageTk.PhotoImage(pil_img)

# Create a Label image to display the image
Label(root, image=tk_img, bg="white").place(x=500, y=270)

root.mainloop()

Run your code using the VS Code run command or by running the following command;

python Chatbot.py

Building the Chatbot logic

Create a Backend

This chatbot will load its data from a JSON file store the data in a dictionary and then create lists inside the dictionary.

On your directory, create a new file and call it answers.json

After coming up with the desired FAQs from clients, create topics from the questions.

The questions will be used on the dropdown menu. Further elaborations on the topics will be stored in answers.json file.

An example of a question like “DevOps Career Paths” will have answers such as “DevOps Engineer” with a little explanation of the roles.

Choose a niche of your taste and work on it.

Handling user input and generating responses

Our chatbot has a dropdown menu, a chat area, a click for answers button, a clear screen, and a close window.

When the user selects a quiz from the dropdown menu and click for answers button, an answer must be displayed in the chat area.

The logic works as follows:

Click for answers

# Create a dictionary to keep track of the last selected response index
last_selected_index = {}

# Response answer based on the selected question
def random_answers():
    selected_response = dropdown.get()
    if selected_response in answers:
        responses_list = answers[selected_response]
        if responses_list:

            # Display the questions in order
            last_index = last_selected_index.get(selected_response, -1)
            last_index = (last_index + 1) % len(responses_list)

            selected_response_text = responses_list[last_index]
            last_selected_index[selected_response] = last_index

            # View answers on the chatbot
            chat_history.config(state=tk.NORMAL)
            chat_history.insert(tk.END, f"{selected_response_text}\n\n")
            chat_history.config(state=tk.DISABLED)
        else:
            chat_history.config(state=tk.NORMAL)
            chat_history.insert(tk.END, "I don't have a response for that.\n\n")
            chat_history.config(state=tk.DISABLED)

Create a function to retrieve the data in the JSON file in order and view the answers on the chat area when the click for answers button is clicked.

Update the Tkinter user interface code to appear like this

# Button to ask the question
ask = Button(root, command=random_answers, width=25, pady=7, text="Click for Answers", fg='black').place(x=500, y=90)

Clear Screen

When the user clicks this button, all the data in the chat area must be deleted. (The chat history will not be saved but it is possible to save the chat history).

Create a function for the clear screen button to delete chat history.

# Clear the chat history
def clear_screen():
    chat_history.config(state=tk.NORMAL)
    chat_history.delete('1.0', tk.END)
    chat_history.config(state=tk.DISABLED)

Close window

This button will exit the user interface and end all interactions with the user.

The function behind this button is as hereunder;

# exit the chatbot
def exit_chat():
    root.quit()

After completing the above code, you should be able to select the dropdown menu, clear screen, and close window. Click for answers will not work since we have not integrated the frontend with the backend.

Integrating the Frontend with the Backend

After designing the user interface and JSON file, the final goal is to achieve a functional chatbot that will return responses when the user interacts with your interface.

import json

This Python code loads initial responses from a JSON file named answers.json. It first initializes an empty dictionary called answers. Then, it attempts to open the JSON file in read mode using a with statement. If the file is found, it loads the contents of the file into the answers dictionary using the json.load() function. If FileNotFoundError is not raised, it simply keeps the answers dictionary empty.

Testing the integration

Run this command on your terminal to open the user interface and interact with the chatbot to verify that the chatbot is fully functional and ready for deployment and distribution.

python chatbot.py

If the chatbot is running without errors, you can now decide to use it on your machine or create an executable file for deployment and distribution.

Conclusion

Chatbots are ideal tools for communication in an organization since they can respond to Frequently Asked Questions (FAQs) with the user and the chatbot can be designed to redirect the user to seek further assistance elsewhere by providing links to websites and contacts to the organization’s customer care.

Chatbots can be easily modified and updated depending on the user's or organization’s demands. Nowadays, Artificial Intelligence is integrated with chatbots and the chatbots can learn as the user interacts with it and adjust the responses accordingly.