Connecting Tech Pros Worldwide Forums | Help | Site Map

Python and Tkinter

kaarthikeyapreyan's Avatar
Member
 
Join Date: Apr 2007
Location: India
Posts: 101
#1   Apr 3 '08
Beginners Game- Tic-Tac-Toe
My first attempt after learning Tkinter
----CODE-----
from Tkinter import *
import tkFont
class myApp:
"""
Defining The Geometry of the GUI
And the variables Used In the The methods

"""

def __init__(self,parent):


self.parent_instance=parent
self.parent_instance.geometry("650x400")

self.myContainer1=Frame(parent)
self.myContainer1.pack()

#Setting the Dimension constraints for few buttons

button_width = 6
button_padx = "2m"
button_pady = "1m"

buttons_frame_padx = "3m"
buttons_frame_pady = "2m"
buttons_frame_ipadx = "3m"
buttons_frame_ipady = "1m"

# label frame
self.label_frame = Frame(self.myContainer1)
self.label_frame.pack(
side=TOP,
ipadx=buttons_frame_ipadx,
ipady=buttons_frame_ipady,
padx=buttons_frame_padx,
pady=buttons_frame_pady,
)

# middle frame
self.middle_frame = Frame(self.myContainer1)
self.middle_frame.pack(side=TOP,
ipadx=buttons_frame_ipadx,
ipady=buttons_frame_ipady,
padx=buttons_frame_padx,
pady=buttons_frame_pady,

fill=BOTH,
expand=YES,
) ###

# bottom frame
self.bottom_frame = Frame(self.myContainer1, relief=GROOVE,
height=50
) ###
self.bottom_frame.pack(side=TOP,
ipadx=buttons_frame_ipadx,
ipady=buttons_frame_ipady,
padx=buttons_frame_padx,
pady=buttons_frame_pady,

fill=BOTH,
expand=YES,
) ###

# left_frame
self.left_frame = Frame(self.middle_frame,
borderwidth=10, relief=RIDGE,
height=250,
width=250,
) ###
self.left_frame.grid(sticky=W+E+S+N)
self.left_frame.pack(side=LEFT,
ipadx=buttons_frame_ipadx,
ipady=buttons_frame_ipady,
padx=buttons_frame_padx,
pady=buttons_frame_pady,

fill=BOTH,
expand=YES,
) ###


### right_frame
self.right_frame = Frame(self.middle_frame,
#borderwidth=5, relief=RIDGE,
width=50,
)
self.right_frame.pack(side=RIGHT,
ipadx=buttons_frame_ipadx,
ipady=buttons_frame_ipady,
padx=buttons_frame_padx,
pady=buttons_frame_pady,

fill=BOTH,
expand=YES,
) ###

### Defining Working Variables

self.plstate=1 ### State of the player in COMPUTER mode
self.statevalue=0 ### State of the player in player mode
self.winvar=0 ### Determine if a player has won
self.dvar=0 ### Detrmine if the match is a draw
self.svar=0### Determine if the result is declared
self.clist=[0,0,0,0,0,0,0,0,0] ### Operating List
self.gstart=0 ### to start the game
self.nstart = 1 ### to disallow only start
self.implist=[]
self.visualist=[]
self.logicalgroups=[[0,4,8],[2,4,6],[0,1,2],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8]] ### Possible combinational List hardcoded...:-(
self.helv20 = tkFont.Font ( family="Helvetica",size=20, weight="bold" ) ### Font defined to display

def action_button(self):

"""
Grid Layout for the buttons in action

"""
self.button0 = Button( self.left_frame,width=2,height=2)
self.button0.grid( row = 0, column = 0, sticky = W+E+N+S )
self.button0.bind("<Button-1>",
lambda
event,arg1=0,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button1 = Button( self.left_frame,width=2,height=2)
self.button1.grid( row = 0, column = 1, sticky = W+E+N+S )
self.button1.bind("<Button-1>",
lambda
event,arg1=1,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button2 = Button(self.left_frame,width=2,height=2)
self.button2.grid( row = 0, column = 2, sticky = W+E+N+S )
self.button2.bind("<Button-1>",
lambda
event,arg1=2,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button3 = Button(self.left_frame,width=2,height=2)
self.button3.grid( row = 1, column = 0, sticky = W+E+N+S )
self.button3.bind("<Button-1>",
lambda
event,arg1=3,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button4 = Button( self.left_frame,width=2,height=2)
self.button4.grid( row = 1, column = 1, sticky = W+E+N+S )
self.button4.bind("<Button-1>",
lambda
event,arg1=4,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button5 = Button( self.left_frame,width=2,height=2)
self.button5.grid( row = 1, column = 2, sticky = W+E+N+S )
self.button5.bind("<Button-1>",
lambda
event,arg1=5,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button6 = Button( self.left_frame,width=2,height=2)
self.button6.grid( row = 2, column = 0, sticky = W+E+N+S )
self.button6.bind("<Button-1>",
lambda
event,arg1=6,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button7 = Button( self.left_frame,width=2,height=2)
self.button7.grid( row = 2, column = 1, sticky = W+E+N+S )
self.button7.bind("<Button-1>",
lambda
event,arg1=7,arg2='M':
self.buttonclick(event,arg1,arg2))

self.button8 = Button( self.left_frame,width=2,height=2)
self.button8.grid( row = 2, column = 2, sticky = W+E+N+S )
self.button8.bind("<Button-1>",
lambda
event,arg1=8,arg2='M':
self.buttonclick(event,arg1,arg2))

self.stare(1)

def stare(self,val):
for id in range(9):
if val == 1 :
refresh="self.button%d.configure(text='!',backgrou nd='grey',state=ACTIVE)"%id
exec(refresh)
else:
refresh="self.button%d.configure(text='',backgroun d='white',state=ACTIVE)"%id
exec(refresh)

def menu_button(self):

"""
Buttons for the control actions

"""
###Defining The New Button
self.newbutton=Button(self.right_frame)
self.newbutton.configure(background='tan',text='NE W GAME',width=10)
self.newbutton.grid(row=0,column=0)
self.newbutton.bind("<Button-1>",self.newbuttonclick)

###Defining The Close Button
self.closebutton=Button(self.right_frame)
self.closebutton.configure(background='tan',text=' CLOSE GAME',width=10)
self.closebutton.grid(row=0,column=1)
self.closebutton.bind("<Button-1>",self.closebuttonclick)

###Defining The start Button
self.startbutton=Button(self.right_frame)
self.startbutton.configure(background='tan',text=' START',width=10)
self.startbutton.grid(row=10,column=0)
self.startbutton.bind("<Button-1>",self.startbuttonclick)

###Defining The Status Button
self.statusbutton1=Button(self.right_frame,width=1 0,relief=GROOVE)
self.statusbutton1.configure(background='blue',tex t='PLAYER ONE TURN',width=15)
self.statusbutton1.grid(row=10,column=1)

self.cplabel=Label(self.right_frame,text="PLAYER VS",fg='blue')
self.cplabel.grid(row=1,column=0)
self.mlabel=Label(self.right_frame,text="TO-START",fg='blue')
self.mlabel.grid(row=4,column=1)
self.gslabel=Label(self.right_frame,text="MODES",f g='blue')
self.gslabel.grid(row=1,column=2)

###Defining The Radio Button
self.rvar=IntVar()
self.avar=IntVar() #To start
self.mvar=IntVar()

self.RB1=Radiobutton(self.right_frame,text='PLAYER ',value=0,variable=self.rvar)
self.RB1.grid(row=2,column=0)
self.RB2=Radiobutton(self.right_frame,text='COMPUT ER',value=1,variable=self.rvar)
self.RB2.grid(row=3,column=0)

self.RB3=Radiobutton(self.right_frame,text='PLAYER ',value=0,variable=self.avar)
self.RB3.grid(row=5,column=1)
self.RB4=Radiobutton(self.right_frame,text='COMPUT ER',value=1,variable=self.avar)
self.RB4.grid(row=6,column=1)

self.RB5=Radiobutton(self.right_frame,text='EASY', value=0,variable=self.mvar)
self.RB5.grid(row=2,column=2)
self.RB6=Radiobutton(self.right_frame,text='NORMAL ',value=1,variable=self.mvar)
self.RB6.grid(row=3,column=2)
self.RB7=Radiobutton(self.right_frame,text='HARD', value=2,variable=self.mvar)
self.RB7.grid(row=4,column=2)

self.rvar.set(0)
self.avar.set(0)
self.mvar.set(0)

def label(self):

"""
Display Constraints of various labels

"""

g_label=Label(self.label_frame,text="Tic Tac Toe",font=self.helv20,fg='blue')
g_label.pack(side=TOP,anchor=CENTER)

s_label=Label(self.bottom_frame,text='COURTESY: QUINTEGRA SOLUTIONS',fg='grey')
s_label.pack(anchor=CENTER)


def newbuttonclick(self,event):

"""
Event That happens if I click
The New Game button

"""
print 'NEW GAME'
for i in range(9):
refresh="self.button%d.configure(text='',backgroun d='white',state=ACTIVE)"%i
exec(refresh)

### Initialising all variables
self.statusbutton1.configure(background='blue',tex t='PLAYER ONE TURN',width=15)
self.clist=[0,0,0,0,0,0,0,0,0]
self.nstart = 1
toplay = self.avar.get()
if toplay == 1:
self.plstate=1
else:
self.plstate=2

self.statevalue=0
self.dvar=0
self.svar=0
self.winvar=0
self.gstart=0
self.implist=[]

self.RB1.config(state=ACTIVE)
self.RB2.config(state=ACTIVE)
self.RB3.config(state=ACTIVE)
self.RB4.config(state=ACTIVE)
self.RB5.config(state=ACTIVE)
self.RB6.config(state=ACTIVE)
self.RB7.config(state=ACTIVE)

self.stare(1)
###

def closebuttonclick(self,event):

"""
Event That happens if I click
The close button

"""
print 'CLOSE GAME'
self.parent_instance.destroy()


def startbuttonclick(self,event):

if self.nstart == 1 :
self.gstart = 1
self.stare(0)

if self.rvar.get() == 1:
self.RB1.config(state=DISABLED)
else:
self.RB2.config(state=DISABLED)
self.RB3.config(state=DISABLED)
self.RB4.config(state=DISABLED)
self.RB5.config(state=DISABLED)
self.RB6.config(state=DISABLED)
self.RB7.config(state=DISABLED)

if self.avar.get() == 1:
self.plstate=2 ### State of the player in COMPUTER mode
self.playmygame()
self.RB3.config(state=DISABLED)
else:
self.plstate=1
self.RB4.config(state=DISABLED)

if self.mvar.get() == 0 :
self.RB6.config(state=DISABLED)
self.RB7.config(state=DISABLED)
elif self.mvar.get() == 1 :
self.RB5.config(state=DISABLED)
self.RB7.config(state=DISABLED)
else:
self.RB5.config(state=DISABLED)
self.RB6.config(state=DISABLED)

self.nstart = 0



def buttonclick(self,event,arg1,arg2):

"""
For Every Action There is an
Equal and opposite reaction
Defining Button Click Events In player mode and COMPUTER mode

"""

if self.gstart == 1 :
if self.rvar.get() == 0:
if self.statevalue==0:
if self.clist[arg1] == 0:
if self.clist[arg1] != 3:
mse_cmd="self.button%d.configure(text='O',backgrou nd='blue')"%arg1
exec(mse_cmd)
self.statusbutton1.configure(text='PLAYER TWO TURN',background='red')
self.clist[arg1]=1
self.statevalue=1
self.checkwin()

else :
if self.clist[arg1] == 0 :
if self.clist[arg1] != 3:
mse_cmd="self.button%d.configure(text='X',backgrou nd='red')"%arg1
exec(mse_cmd)
self.statusbutton1.configure(text='PLAYER ONE TURN',background='blue',width=15)
self.clist[arg1]=2
self.statevalue=0
self.checkwin()

else:

if self.plstate == 1:
if self.clist[arg1] == 0:
mse_cmd="self.button%d.configure(text='O',backgrou nd='blue')"%arg1
exec(mse_cmd)
self.clist[arg1]=1
### COMPUTER 's Turn
self.checkwin()
if self.dvar != 1 :
self.plstate=2
self.statusbutton1.configure(text='COMPUTER TURN',background='red')
if self.plstate == 2 :
self.win()
self.caution()
if self.mvar.get() == 2 :
self.playmygame()
elif self.mvar.get() == 1:
self.normal()
else :
self.easy()
self.checkwin()

###Check for winning possiblity for both the players
###And then implement it

def win(self):

"""
Check the winning Possiblities in COMPUTER mode

"""

for subgroup in self.logicalgroups:
if self.plstate==2:
if self.clist[subgroup[0]] == 2 and self.clist[subgroup[1]] == 2:
if self.clist[subgroup[2]] == 0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[2]
exec(pce_cmd)
self.clist[subgroup[2]]=2
self.plstate=1
if self.plstate==2:
if self.clist[subgroup[0]] == 2 and self.clist[subgroup[2]] == 2:
if self.clist[subgroup[1]] == 0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[1]
exec(pce_cmd)
self.clist[subgroup[1]]=2
self.plstate=1
if self.plstate==2:
if self.clist[subgroup[1]] == 2 and self.clist[subgroup[2]] == 2:
if self.clist[subgroup[0]]==0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[0]
exec(pce_cmd)
self.clist[subgroup[0]]=2
self.plstate=1
self.statusbutton1.configure(text='PLAYER ONE TURN',background='blue')


def caution(self):

"""
Check failures the in COMPUTER mode
"""
if self.mvar.get() == 0 :
pass
else :
for subgroup in self.logicalgroups:
if self.plstate==2:
if self.clist[subgroup[0]] == 1 and self.clist[subgroup[1]] == 1:
if self.clist[subgroup[2]] == 0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[2]
exec(pce_cmd)
self.clist[subgroup[2]]=2
self.plstate=1
if self.plstate==2:
if self.clist[subgroup[0]] == 1 and self.clist[subgroup[2]] == 1:
if self.clist[subgroup[1]]==0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[1]
exec(pce_cmd)
self.clist[subgroup[1]]=2
self.plstate=1
if self.plstate==2:
if self.clist[subgroup[1]] == 1 and self.clist[subgroup[2]] == 1:
if self.clist[subgroup[0]]==0:
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%subgroup[0]
exec(pce_cmd)
self.clist[subgroup[0]]=2
self.plstate=1

self.statusbutton1.configure(text='PLAYER ONE TURN',background='blue')

##########################################
def playmygame(self):

for index,implements in enumerate(self.clist):
if implements == 2:
self.implist.append(index)

if self.clist[4] == 0 :
if self.plstate == 2 :
self.button4.configure(text='X',background='red')
self.clist[4] =2
self.plstate=1

self.proximity()

def proximity(self):

store=[]
proxlist=[]
for index,val in enumerate(self.clist):
if val == 1 :
store.append(index)


for sub in self.logicalgroups:
for index,enter in enumerate(store):
if enter in sub :
if sub[0] == enter :
proxlist.append(sub[1])

elif sub[1] == enter :
proxlist.append(sub[0])
proxlist.append(sub[2])

elif sub[2] == enter :
proxlist.append(sub[1])

for proxies in proxlist:
if self.plstate == 2 :
if self.clist[proxies] == 0 :
self.clist[proxies] = 2
pr_cmd="self.button%d.configure(text='X',backgroun d='red')"%proxies
exec(pr_cmd)
self.plstate = 1
##########################################
def normal(self):

for index,implements in enumerate(self.clist):
if implements == 2:
self.implist.append(index)

self.reason()
for index,j in enumerate(self.reasoninglist):
if j == 0 :
self.visualise(self.logicalgroups[index])
for index1,sgp in enumerate(self.visualist):
if sgp == 0:
if self.plstate == 2 :
temp=self.logicalgroups[index]
pce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%temp[index1]
exec(pce_cmd)
self.clist[temp[index1]]=2
self.plstate=1

if self.plstate == 2 :
for index2,nonval in enumerate(self.clist):
if nonval == 0 :
if self.plstate == 2 :
nce_cmd="self.button%d.configure(text='X',backgrou nd='red')"%index2
exec(nce_cmd)
self.clist[index2]=2
self.plstate=1


def visualise(self,Slist):
self.visualist=[]
for i in Slist:
self.visualist.append(self.clist[i])

def reason(self):

self.reasoninglist=[]
for group in self.logicalgroups:
self.visualise(group)
if 1 in self.visualist:
self.reasoninglist.append('R')
else :
self.reasoninglist.append(0)
##########################################
def easy(self):

for index,unmarked in enumerate(self.logicalgroups):
if self.clist[unmarked[0]] == 0:
if self.plstate == 2 :
cmd="self.button%d.configure(text='X',background=' red')"%unmarked[0]
exec(cmd)
self.clist[unmarked[0]]=2
self.plstate=1
if self.clist[unmarked[1]] == 0:
if self.plstate == 2 :
cmd="self.button%d.configure(text='X',background=' red')"%unmarked[1]
exec(cmd)
self.clist[unmarked[1]]=2
self.plstate=1
if self.clist[unmarked[2]] == 0:
if self.plstate == 2 :
cmd="self.button%d.configure(text='X',background=' red')"%unmarked[2]
exec(cmd)
self.clist[unmarked[2]]=2
self.plstate=1

##########################################

def statewin(self,val):

"""
Terminal Output of Who wins

"""
if self.svar == 0:
if val == 1 :
print 'PLAYER ONE WINS'
elif self.rvar.get() == 1:
print 'COMPUTER WINS'
else:
print 'PLAYER TWO WINS'

self.svar=1

def checkwin(self):

"""
Algorithm to check the winning Possiblities

"""

for subgroup in self.logicalgroups:
if self.clist[subgroup[0]] == 1:
if self.clist[subgroup[1]] == 1:
if self.clist[subgroup[2]] == 1:
if self.svar == 0:
self.winvar = 1
self.statewin(1)
self.fil(self.winvar)

if self.clist[subgroup[0]] == 2:
if self.clist[subgroup[1]] == 2:
if self.clist[subgroup[2]] == 2:
if self.svar ==0 :
self.winvar = 2
self.statewin(2)
self.fil(self.winvar)

self.draw()

def fil(self,IDN):

"""
To avoid Playing After a person Wins the game
"""

for index,ID in enumerate(self.clist):
if ID == 0 :
cbs="self.button%d.configure(text='--',background='white',state=DISABLED)"%index
exec(cbs)
self.clist[index] = 3

if IDN==1:
Player='PLAYER ONE'
elif self.rvar.get() == 1:
Player='COMPUTER'
else:
Player='PLAYER TWO'

###Display The Winner In a seperate Window
msg_box=Toplevel()
msg_box.title("Winner")
msg_box.geometry("350x50")
wd="Display=Label(msg_box,text='%s WINS',font=self.helv20)"%(Player)
exec(wd)
Display.pack()

def draw(self):

"""
To Declare a Draw

"""
if not 0 in self.clist:
if not 3 in self.clist:
if self.winvar == 0:
print 'MATCH DRAW'
msg_box=Toplevel()
msg_box.title("MATCH RESULT")
msg_box.geometry("300x50")
Display=Label(msg_box,text='MATCH DRAWN',font=self.helv20)
Display.pack()
self.dvar=1 ### Setting the draw flag

root = Tk()
root.title("TIC TAC TOE")
myapp = myApp(root)
myapp.action_button()
myapp.menu_button()
myapp.label()
root.mainloop()

Last edited by kaarthikeyapreyan; Apr 3 '08 at 10:52 AM. Reason: Reduced Explanations..



Reply