Building a Simple Tic-Tac-Toe Game with Python’s Tkinter: A Step-by-Step Tutorial for Beginners

Xpress Innovations
4 min readAug 18, 2024

--

Step-by-Step guide to Python games

Are you new to Python programming and looking for a hands-on project to enhance your skills? Developing a simple Tic-Tac-Toe game using Python’s tkinter library is an excellent way to learn the basics of GUI (Graphical User Interface) programming. In this step-by-step tutorial, we’ll guide you through the process of building a Tic-Tac-Toe game from scratch. By the end of this post, you'll have a functional game that you can play, customize, and even expand on.

Why Build a Tic-Tac-Toe Game in Python?

Creating a Tic-Tac-Toe game in Python offers several learning opportunities:

  • Understanding GUI development: Learn how to create and manage a user interface using tkinter.
  • Game logic implementation: Practice managing game states and logic in Python.
  • Event handling: Gain experience in handling user interactions and events in a Python application.

Prerequisites for This Python Project

Before we begin, ensure you have Python installed on your system. The tkinter library comes pre-installed with most Python distributions, so you shouldn't need any additional installations. If you don’t have Python installed, you can download it from python.org.

Step 1: Setting Up the Python Environment

To get started, open your favorite Python IDE or text editor, and create a new Python file (e.g., tic_tac_toe.py). Begin by importing the necessary modules:

pip install tkinter
import tkinter as tk
from tkinter import messagebox

Here, tkinter is the library we’ll use to create the graphical interface, and messagebox will allow us to display pop-up messages at the end of the game.

Step 2: Creating the Game Class

Next, we’ll define a class called TicTacToe that will contain all the logic and GUI elements for our game:

class TicTacToe:
def __init__(self, root):
self.root = root
self.root.title("Tic Tac Toe")
self.current_player = 'X'
self.board = [''] * 9
self.buttons = []
self.create_board()
  • self.root.title("Tic Tac Toe"): Sets the window title.
  • self.current_player = 'X': Initializes the game with player 'X' starting.
  • self.board = [''] * 9: Creates an empty list representing the game board.

Step 3: Building the Tic-Tac-Toe Board

In this step, we’ll create the 3x3 grid of buttons that will serve as our game board:

def create_board(self):
for i in range(9):
button = tk.Button(self.root, text='', font=('Helvetica', 20), height=3, width=6,
command=lambda i=i: self.click_button(i))
button.grid(row=i//3, column=i%3)
self.buttons.append(button)

Each button represents a cell on the Tic-Tac-Toe board. The command parameter links each button to a click event, allowing us to detect when a player selects a cell.

Step 4: Handling User Clicks and Updating the Board

Now, we’ll define the behavior when a player clicks on a button:

def click_button(self, index):
if not self.board[index]:
self.board[index] = self.current_player
self.buttons[index].config(text=self.current_player, state='disabled',
disabledforeground='blue' if self.current_player == 'X' else 'red')
if self.check_winner():
self.show_winner(self.current_player)
elif '' not in self.board:
self.show_draw()
else:
self.current_player = 'O' if self.current_player == 'X' else 'X'

Step 5: Implementing Win Conditions

The next step is to define how the game checks if a player has won:

def check_winner(self):
win_conditions = [(0, 1, 2), (3, 4, 5), (6, 7, 8),
(0, 3, 6), (1, 4, 7), (2, 5, 8),
(0, 4, 8), (2, 4, 6)]
for condition in win_conditions:
if self.board[condition[0]] == self.board[condition[1]] == self.board[condition[2]] != '':
return True
return False

This method evaluates all possible winning combinations on the board. If one of these combinations is filled with the same player’s symbol, that player wins.

Step 6: Displaying the Game Outcome

Once a player wins or the game ends in a draw, we’ll display a message and ask if the user wants to play again:

def show_winner(self, player):
if messagebox.askyesno("Game Over", f"Congratulations {player}! You won! Do you want to play again?"):
self.reset_board()
else:
self.root.quit()

def show_draw(self):
if messagebox.askyesno("Game Over", "This was a draw! Do you want to play again?"):
self.reset_board()
else:
self.root.quit()

These methods utilize messagebox.askyesno to prompt the user with a "Yes" or "No" option. If "Yes" is selected, the game board resets for a new game.

Step 7: Resetting the Board for a New Game

To reset the game, we clear the board and re-enable the buttons:

def reset_board(self):
self.board = [''] * 9
self.current_player = 'X'
for button in self.buttons:
button.config(text='', state='normal')

Step 8: Running the Game

Finally, we need to create an instance of the TicTacToe class and start the tkinter main loop:

if __name__ == "__main__":
root = tk.Tk()
game = TicTacToe(root)
root.mainloop()

Conclusion

By following this step-by-step guide, you’ve successfully built a simple Tic-Tac-Toe game using Python and tkinter. This project is not only fun but also provides a practical way to understand GUI programming, event handling, and game logic in Python. As you continue learning, consider expanding this game with additional features like a scoreboard or AI opponent. Keep experimenting and happy coding!

Additional Resources:

--

--

Xpress Innovations

Passionate about IT and AI solutions. I write to demystify the complex world of technology, making it accessible and exciting for everyone.