I'm a software developer based in the United Arab Emirates 🇦🇪. I enjoy coding open-source projects that solve unique, out-of-the-box problems. I love combining my hobbies like design, coding and building various cool projects with Raspberry Pi and IoT. Obsessed with Automation and Software Development.
Would you like to have some fun ?What about playing XO ?Today we will make this game alone even we are able to CUSTOMIZE IT! Like X will be a 💖 and O is 😀! It's possible @everyone! Let's further ado, let's get into it!
We have 2 parts! ( Click on the part to jump to it , WITH MAGIC )
We are going to make a tic tac toe game, this game can be played VS any friend next to you, on same PC.!1. Create Tkinter WindowOf course we need a window for our game! So let's start by importing Tkinter
# Import Tkinter
from tkinter import *
import tkinter
# Create the windowwindow = Tk()
window.title("Tic Tac Toe - PC")
window.resizable(0, 0) # Use this secret command to make the window fits all needs, buttons and etc.
2. Main buttons
To make the perfect game, we need buttons which are clickable, the final result should be 3x3 buttons.
Note : We added a list to store the buttons, this is optional, but it will help you in the next steps!
3. Change the text
This part seems a little big, but also in the same time easy but little complicated, in this part, as you saw the buttons run a function called button_click and it provides a parameter which is the button name like b1 , b2 or b3 . It will be stored in a variable called button_clicked so let's make the function, then it will change the color and text of the button depending on the turn, so if it is X turn, it will be X, so of course we will need to set the turn variable to X otherwise, each time the button is clicked, it will be X and never be O also set it global in the function. Let's do it! Try doing it yourself, it's easy and simple!
# Button_click functiondefbutton_click(button_clicked):global turn
# We won't need to check if button is empty, because we will make# it disabled when we click on it. So it cannot be clicked again.if turn == "X":
# Button text is X and disabled
button_clicked.config(text="X", state=DISABLED)
# Button background color
button_clicked.config(bg="red")
turn = "O"elif turn == "O": # We will use elif here not if, or then, it won't work properly# Button text is O and disabled
button_clicked.config(text="O", state=DISABLED)
# Button background color
button_clicked.config(bg="blue")
turn = "X"
4. Check winner
Of course to get the game working properly we need to detect who is the winner, which is easy but you might need to focus in this part especially because it is a little bit about Mathematics. So be a mathematician 😂! So, a sample to check, like if the first row is X
# if first row is Xif button1["text"] == "X" and button2["text"] == "X" and button3["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
So we need now to do for X and O the rest, like row, column and diagonal and so on. It takes time, but it's easy to understand the sample which makes the process easier to do! Just try following the sample given above, just be sure to change buttons and be sure these buttons make a row, column, or diagonal.
We made the buttons disabled to identify that they are clicked to be able to detect a DRAW!
# if first row is Xif button1["text"] == "X"and button2["text"] == "X"and button3["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first row is Oelif button1["text"] == "O"and button2["text"] == "O"and button3["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second row is Xelif button4["text"] == "X"and button5["text"] == "X"and button6["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second row is Oelif button4["text"] == "O"and button5["text"] == "O"and button6["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third row is Xelif button7["text"] == "X"and button8["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third row is Oelif button7["text"] == "O"and button8["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first column is Xelif button1["text"] == "X"and button4["text"] == "X"and button7["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first column is Oelif button1["text"] == "O"and button4["text"] == "O"and button7["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second column is Xelif button2["text"] == "X"and button5["text"] == "X"and button8["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second column is Oelif button2["text"] == "O"and button5["text"] == "O"and button8["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third column is Xelif button3["text"] == "X"and button6["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third column is Oelif button3["text"] == "O"and button6["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first diagonal is Xelif button1["text"] == "X"and button5["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first diagonal is Oelif button1["text"] == "O"and button5["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second diagonal is Xelif button3["text"] == "X"and button5["text"] == "X"and button7["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second diagonal is Oelif button3["text"] == "O"and button5["text"] == "O"and button7["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if all buttons are disabledelif button1["state"] == DISABLED and button2["state"] == DISABLED and button3["state"] == DISABLED and button4["state"] == DISABLED and button5["state"] == DISABLED and button6["state"] == DISABLED and button7["state"] == DISABLED and button8["state"] == DISABLED and button9["state"] == DISABLED:
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="Draw!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
5. Final Step - Run Tkinter in a main loop
Now the final step is to run the actual game, in this part we will use if __name__ == "__main__"
to avoid errors xD!
if __name__ == "__main__":
window.mainloop()
Final Code and Video
# Import Tkinterfrom tkinter import *
import tkinter
# Create the window
window = Tk()
window.title("Tic Tac Toe - PC")
window.resizable(0, 0) # Use this secret command to make the window fits all needs, buttons and etc.# Create the 9 buttons
button1 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button1))
button1.grid(row=1, column=1)
button2 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button2))
button2.grid(row=1, column=2)
button3 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button3))
button3.grid(row=1, column=3)
button4 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button4))
button4.grid(row=2, column=1)
button5 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button5))
button5.grid(row=2, column=2)
button6 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button6))
button6.grid(row=2, column=3)
button7 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button7))
button7.grid(row=3, column=1)
button8 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button8))
button8.grid(row=3, column=2)
button9 = Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: button_click(button9))
button9.grid(row=3, column=3)
# Store buttons in a list
buttons = [button1, button2, button3, button4, button5, button6, button7, button8, button9]
# Create turn variable
turn = "X"# Button_click functiondefbutton_click(button_clicked):global turn
# We won't need to check if button is empty, because we will make# it disabled when we click on it. So it cannot be clicked again.if turn == "X":
# Button text is X and disabled
button_clicked.config(text="X", state=DISABLED)
# Button background color
button_clicked.config(bg="red")
turn = "O"elif turn == "O": # We will use elif here not if, or then, it won't work properly# Button text is O and disabled
button_clicked.config(text="O", state=DISABLED)
# Button background color
button_clicked.config(bg="blue")
turn = "X"# if first row is Xif button1["text"] == "X"and button2["text"] == "X"and button3["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first row is Oelif button1["text"] == "O"and button2["text"] == "O"and button3["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second row is Xelif button4["text"] == "X"and button5["text"] == "X"and button6["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second row is Oelif button4["text"] == "O"and button5["text"] == "O"and button6["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third row is Xelif button7["text"] == "X"and button8["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third row is Oelif button7["text"] == "O"and button8["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first column is Xelif button1["text"] == "X"and button4["text"] == "X"and button7["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first column is Oelif button1["text"] == "O"and button4["text"] == "O"and button7["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second column is Xelif button2["text"] == "X"and button5["text"] == "X"and button8["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second column is Oelif button2["text"] == "O"and button5["text"] == "O"and button8["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third column is Xelif button3["text"] == "X"and button6["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if third column is Oelif button3["text"] == "O"and button6["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first diagonal is Xelif button1["text"] == "X"and button5["text"] == "X"and button9["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if first diagonal is Oelif button1["text"] == "O"and button5["text"] == "O"and button9["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second diagonal is Xelif button3["text"] == "X"and button5["text"] == "X"and button7["text"] == "X":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="X wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if second diagonal is Oelif button3["text"] == "O"and button5["text"] == "O"and button7["text"] == "O":
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="O wins!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
# if all buttons are disabledelif button1["state"] == DISABLED and button2["state"] == DISABLED and button3["state"] == DISABLED and button4["state"] == DISABLED and button5["state"] == DISABLED and button6["state"] == DISABLED and button7["state"] == DISABLED and button8["state"] == DISABLED and button9["state"] == DISABLED:
# Disable all buttonsfor button in buttons:
button.config(state=DISABLED)
tkinter.Message(window, text="Draw!", font='Times 20 bold').grid(row=4, column=1, columnspan=3)
if __name__ == "__main__":
window.mainloop()
Single Player - 1. Basics
As we know we need to make some basics for the game.So basics for our game we will use
# import tkinterimport tkinter
# create the window
window = tkinter.Tk()
window.title("Tic Tac Toe")
window.resizable(0, 0) # Use this secret command to make the window fits all needs, buttons and etc.
2. Buttons
We will make 9 buttons, and when they are clicked they run a function called btn_click which makes further process to make the game functional and fun.
# create 9 buttons and grid them 3x3
b1 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b1)) # create button
b1.grid(row=1, column=1) # arrange the buttons in a 3x3 grid
b2 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b2))
b2.grid(row=1, column=2)
b3 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b3))
b3.grid(row=1, column=3)
b4 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b4))
b4.grid(row=2, column=1)
b5 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b5))
b5.grid(row=2, column=2)
b6 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b6))
b6.grid(row=2, column=3)
b7 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b7))
b7.grid(row=3, column=1)
b8 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b8))
b8.grid(row=3, column=2)
b9 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b9))
b9.grid(row=3, column=3)
# store buttons in a list
buttons = [b1, b2, b3, b4, b5, b6, b7, b8, b9]
3. Change button specifications when clicked
As we know, when the button is clicked, it calls 📞 btn_click function. Let's create the function!
```py
# create btn_click function
def btn_click(btn_clicked):
btn_clicked['text'] = "X" # change the text of the button
btn_clicked['state'] = 'disabled' # disable the button
btn_clicked['bg'] = 'red' # change the background color of the button
4. Check for winner
We will do some if statements to check if someone won or not yet, and if not yet “ else " the PC will filter the not disabled buttons then randomly choose from them an button and fill with O and disable it and change color to Blue (in the next part).
defcheckforwinner():# if first row is Xif b1['text'] == 'X'and b2['text'] == 'X'and b3['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second row is Xelif b4['text'] == 'X'and b5['text'] == 'X'and b6['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third row is Xelif b7['text'] == 'X'and b8['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first column is Xelif b1['text'] == 'X'and b4['text'] == 'X'and b7['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second column is Xelif b2['text'] == 'X'and b5['text'] == 'X'and b8['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third column is Xelif b3['text'] == 'X'and b6['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first diagonal is Xelif b1['text'] == 'X'and b5['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second diagonal is Xelif b3['text'] == 'X'and b5['text'] == 'X'and b7['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
5. Fill non-disabled random button and check if PC wins
We will check and filter the buttons which are not disabled and store them in a list, then randomly choose a button and then do the next.
else:
emptybuttons = []
if b1['text'] == " ":
emptybuttons.append(b1)
if b2['text'] == " ":
emptybuttons.append(b2)
if b3['text'] == " ":
emptybuttons.append(b3)
if ['text'] == " ":
emptybuttons.append(b4)
if b5 == " ":
emptybuttons.append(b5)
if b6['text'] == " ":
emptybuttons.append(b6)
if b7['text'] == " ":
emptybuttons.append(b7)
if b8['text'] == " ":
emptybuttons.append(b8)
if b9['text'] == " ":
emptybuttons.append(b9)
# randomly select a button from the listimport random
random_button = random.choice(emptybuttons)
# change button text to O
random_button.config(text="O")
# make button disabled
random_button.config(state=tkinter.DISABLED)
# make O blue
random_button.config(bg="blue")
# clear the list
emptybuttons.clear()
# if first row is Oif b1['text'] == 'O'and b2['text'] == 'O'and b3['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second row is Oelif b4['text'] == 'O'and b5['text'] == 'O'and b6['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third row is Oelif b7['text'] == 'O'and b8['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first column is Oelif b1['text'] == 'O'and b4['text'] == 'O'and b7['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second column is Oelif b2['text'] == 'O'and b5['text'] == 'O'and b8['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third column is Oelif b3['text'] == 'O'and b6['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first diagonal is Oelif b1['text'] == 'O'and b5['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second diagonal is Oelif b3['text'] == 'O'and b5['text'] == 'O'and b7['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
checkforwinner()
Final Step - 6. Run Tkinter
The final step is to run tkinter so the game works, we will use if if __name__ == "__main__" then we can run tkinter to avoid errors.
if __name__ == "__main__":
window.mainloop()
Full code and Video
# import tkinterimport tkinter
# create the window
window = tkinter.Tk()
window.title("Tic Tac Toe")
window.resizable(0, 0) # Use this secret command to make the window fits all needs, buttons and etc.# create 9 buttons and grid them 3x3
b1 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b1)) # create button
b1.grid(row=1, column=1) # arrange the buttons in a 3x3 grid
b2 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b2))
b2.grid(row=1, column=2)
b3 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b3))
b3.grid(row=1, column=3)
b4 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b4))
b4.grid(row=2, column=1)
b5 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b5))
b5.grid(row=2, column=2)
b6 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b6))
b6.grid(row=2, column=3)
b7 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b7))
b7.grid(row=3, column=1)
b8 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b8))
b8.grid(row=3, column=2)
b9 = tkinter.Button(window, text=" ", font='Times 20 bold', bg='white', height=4, width=8, command=lambda: btn_click(b9))
b9.grid(row=3, column=3)
# store buttons in a list
buttons = [b1, b2, b3, b4, b5, b6, b7, b8, b9]
# create btn_click functiondefbtn_click(btn_clicked):
btn_clicked['text'] = "X"# change the text of the button
btn_clicked['state'] = 'disabled'# disable the button
btn_clicked['bg'] = 'red'# change the background color of the buttondefcheckforwinner():# if first row is Xif b1['text'] == 'X'and b2['text'] == 'X'and b3['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second row is Xelif b4['text'] == 'X'and b5['text'] == 'X'and b6['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third row is Xelif b7['text'] == 'X'and b8['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first column is Xelif b1['text'] == 'X'and b4['text'] == 'X'and b7['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second column is Xelif b2['text'] == 'X'and b5['text'] == 'X'and b8['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third column is Xelif b3['text'] == 'X'and b6['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first diagonal is Xelif b1['text'] == 'X'and b5['text'] == 'X'and b9['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second diagonal is Xelif b3['text'] == 'X'and b5['text'] == 'X'and b7['text'] == 'X':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='X wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
else:
emptybuttons = []
if b1['text'] == " ":
emptybuttons.append(b1)
if b2['text'] == " ":
emptybuttons.append(b2)
if b3['text'] == " ":
emptybuttons.append(b3)
if ['text'] == " ":
emptybuttons.append(b4)
if b5 == " ":
emptybuttons.append(b5)
if b6['text'] == " ":
emptybuttons.append(b6)
if b7['text'] == " ":
emptybuttons.append(b7)
if b8['text'] == " ":
emptybuttons.append(b8)
if b9['text'] == " ":
emptybuttons.append(b9)
# randomly select a button from the listimport random
random_button = random.choice(emptybuttons)
# change button text to O
random_button.config(text="O")
# make button disabled
random_button.config(state=tkinter.DISABLED)
# make O blue
random_button.config(bg="blue")
# clear the list
emptybuttons.clear()
# if first row is Oif b1['text'] == 'O'and b2['text'] == 'O'and b3['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second row is Oelif b4['text'] == 'O'and b5['text'] == 'O'and b6['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third row is Oelif b7['text'] == 'O'and b8['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first column is Oelif b1['text'] == 'O'and b4['text'] == 'O'and b7['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second column is Oelif b2['text'] == 'O'and b5['text'] == 'O'and b8['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if third column is Oelif b3['text'] == 'O'and b6['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if first diagonal is Oelif b1['text'] == 'O'and b5['text'] == 'O'and b9['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
# if second diagonal is Oelif b3['text'] == 'O'and b5['text'] == 'O'and b7['text'] == 'O':
# make all buttons disabledfor btn in buttons:
btn['state'] = 'disabled'
tkinter.Message(window, text='O wins!', width=100, bg='green', font='Times 20 bold').grid(row=4, column=1)
checkforwinner()
if __name__ == "__main__":
window.mainloop()
The End! I hope you ❤️ the blog. Please smash the like button if you 👍 it! 😊, thank you @everyone !
Special Thanks to Tealfeed team for promoting my blogs on Tealfeed also Ayush Anand, Community Manager.