I was trying to make a simple project (tic tac toe) to use the things I learned in python and tkinter, But when I was making a quit button it worked when I run the python file, but when I converted the python file(.py) to an executable file(.exe) an error happened it was: (NameError: name 'quit' is not defined).
This is the code:
# Importing tkinter module
from tkinter import *
# =================
while True:
# Main screen settings
app = Tk()
app.title("tic tac toe")
app.iconbitmap("icon.ico")
app.config(bg="#00a0a0")
# =================
# Setting up Back Ground
bg = PhotoImage(file="bg.png")
canvas = Canvas(app,
width=500,
height=500,
bg="#00a0a0")
canvas.grid(row=0,
column=0)
canvas.create_image(250, 250 , image=bg)
# =================
# Creating board main variable
GameVar = [["Empty" , "Empty" , "Empty"],
["Empty" , "Empty" , "Empty"],
["Empty" , "Empty" , "Empty"]]
# =================
# Creating clicking functions
xoro = "O"
def place1():
global xoro
if GameVar[0][0] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[0][0] = xoro
Button1.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place2():
global xoro
if GameVar[0][1] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[0][1] = xoro
Button2.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place3():
global xoro
if GameVar[0][2] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[0][2] = xoro
Button3.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place4():
global xoro
if GameVar[1][0] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[1][0] = xoro
Button4.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place5():
global xoro
if GameVar[1][1] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[1][1] = xoro
Button5.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place6():
global xoro
if GameVar[1][2] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[1][2] = xoro
Button6.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place7():
global xoro
if GameVar[2][0] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[2][0] = xoro
Button7.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place8():
global xoro
if GameVar[2][1] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[2][1] = xoro
Button8.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
def place9():
global xoro
if GameVar[2][2] == "Empty":
if xoro == "X":
xoro = "O"
elif xoro == "O":
xoro = "X"
GameVar[2][2] = xoro
Button9.config(text=xoro,
font="Arial 57 bold",
height=1,
width=3)
CheckWin()
# =================
# Creating function that check if any player won the game
def CheckWin():
global CheckXVar
global CheckYVar
CheckXVar = ((GameVar[0][0]=="X" and GameVar[0][1]=="X" and GameVar[0][2]=="X") or
(GameVar[1][0]=="X" and GameVar[1][1]=="X" and GameVar[1][2]=="X") or
(GameVar[2][0]=="X" and GameVar[2][1]=="X" and GameVar[2][2]=="X") or
(GameVar[0][0]=="X" and GameVar[1][0]=="X" and GameVar[2][0]=="X") or
(GameVar[0][1]=="X" and GameVar[1][1]=="X" and GameVar[2][1]=="X") or
(GameVar[0][2]=="X" and GameVar[1][2]=="X" and GameVar[2][2]=="X") or
(GameVar[0][0]=="X" and GameVar[1][1]=="X" and GameVar[2][2]=="X") or
(GameVar[2][0]=="X" and GameVar[1][1]=="X" and GameVar[0][2]=="X"))
CheckOVar = ((GameVar[0][0]=="O" and GameVar[0][1]=="O" and GameVar[0][2]=="O") or
(GameVar[1][0]=="O" and GameVar[1][1]=="O" and GameVar[1][2]=="O") or
(GameVar[2][0]=="O" and GameVar[2][1]=="O" and GameVar[2][2]=="O") or
(GameVar[0][0]=="O" and GameVar[1][0]=="O" and GameVar[2][0]=="O") or
(GameVar[0][1]=="O" and GameVar[1][1]=="O" and GameVar[2][1]=="O") or
(GameVar[0][2]=="O" and GameVar[1][2]=="O" and GameVar[2][2]=="O") or
(GameVar[0][0]=="O" and GameVar[1][1]=="O" and GameVar[2][2]=="O") or
(GameVar[2][0]=="O" and GameVar[1][1]=="O" and GameVar[0][2]=="O"))
# =================
# Creating winning window
if CheckXVar:
Button1.config(state="disabled")
Button2.config(state="disabled")
Button3.config(state="disabled")
Button4.config(state="disabled")
Button5.config(state="disabled")
Button6.config(state="disabled")
Button7.config(state="disabled")
Button8.config(state="disabled")
Button9.config(state="disabled")
# Setting up XWin main settings
XWin = Toplevel(app)
XWin.title("Winner")
XWin.iconbitmap("icon.ico")
# =================
# Making XWin label and button
Label(XWin,
text="Player (X) won the game",
fg="#c71ab0",
font=("Arial" , 30 , "bold")).pack()
Button(XWin,
text="Click to play again",
fg="#00a0a0",
bd=0,
cursor="hand2",
relief="flat",
font=("Arial" , 15 , "bold"),
command=app.destroy).pack()
# =================
elif CheckOVar:
Button1.config(state="disabled")
Button2.config(state="disabled")
Button3.config(state="disabled")
Button4.config(state="disabled")
Button5.config(state="disabled")
Button6.config(state="disabled")
Button7.config(state="disabled")
Button8.config(state="disabled")
Button9.config(state="disabled")
# Setting up OWin main settings
OWin = Toplevel(app)
OWin.title("Winner")
OWin.iconbitmap("icon.ico")
# =================
# Making OWin label and button
Label(OWin,
text="Player (O) won the game",
fg="#c71ab0",
font=("Arial" , 30 , "bold")).pack()
Button(OWin,
text="Click to play again",
fg="#00a0a0",
bd=0,
cursor="hand2",
relief="flat",
font=("Arial" , 15 , "bold"),
command=app.destroy).pack()
# =================
# =================
# Creating Buttons
Button1 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place1)
Button1.place(x=10,
y=10)
Button2 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place2)
Button2.place(x=180,
y=10)
Button3 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place3)
Button3.place(x=350,
y=10)
Button4 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place4)
Button4.place(x=10,
y=180)
Button5 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place5)
Button5.place(x=180,
y=180)
Button6 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place6)
Button6.place(x=350,
y=180)
Button7 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place7)
Button7.place(x=10,
y=350)
Button8 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place8)
Button8.place(x=180,
y=350)
Button9 = Button(app,
text="",
height=9,
width=20,
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
bd=0,
command=place9)
Button9.place(x=350,
y=350)
# =================
# Creating quit function
def quito():
quit()
# =================
# Creating quit button
quit_button = Button(app,
text="Quit",
font=("Arial" , 15 , "bold"),
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
command=quito)
quit_button.grid(row=1,
column=0)
# =================
# Running main loop
app.mainloop()
# =================
This is the quito function:
# Creating quit function
def quito():
quit()
# =================
And this is the code that make button:
# Creating quit button
quit_button = Button(app,
text="Quit",
font=("Arial" , 15 , "bold"),
bg="#00a0a0",
fg="#c71ab0",
activebackground="#00a0a0",
activeforeground="#c71ab0",
command=quito)
quit_button.grid(row=1,
column=0)
# =================
I wanted to put images but I and because I don't have enough points in stack overflow
Please any one help.
CodePudding user response:
TLDR; use this command=app.destroy instead of this command=quito.
quit is not defined occurs because the function quito doesn't have access to such variable named quit hence not defined.
Assign the command at the quit button to point to app.destroy
like so - command=app.destroy that supposed to work because you provide an instance of the app hence the function has a direct access to the app allowing it to close it.
