I'm trying to program Tic-tac-toe. When I run my program, the X's and O's pop up in all sorts of strange locations, and they don't "settle" into their proper positions until the very last move of the game. Here is my code:
'''Tic-tac-toe.
'''
from Tkinter import *
SQU_SIZE = 100; DILATION = 3.5
BKGD = 'white'; FRGD = 'black'; LET_CLR = 'green'
THICK = 15; OFFSET = 5
'''Base frame.'''
class App(Frame):
'''Constructor method.'''
def __init__(self, master):
Frame.__init__(self, master)
self.grid()
self.create_widgets()
def show_letter(self, x,y, w,h):
self.button[x][y].config(state = DISABLED)
self.button[x][y].grid_remove()
self.letter[x][y] = Canvas(width = SQU_SIZE, height = SQU_SIZE,\
bg = 'white')#BKGD)
if self.Xs_turn:
self.letter[x][y].create_line(10,10, SQU_SIZE-OFFSET,\
SQU_SIZE-OFFSET, width = THICK,\
fill = FRGD)
self.letter[x][y].create_line(SQU_SIZE-OFFSET,2*OFFSET,\
2*OFFSET,SQU_SIZE-OFFSET,\
width = THICK, fill = FRGD)
else: #O's turn
self.letter[x][y].create_oval(10,10, SQU_SIZE-OFFSET,\
SQU_SIZE-OFFSET, width = THICK,\
outline = FRGD, fill = BKGD)
self.letter[x][y].grid(row = y, column = x)
print y, x
self.Xs_turn = not self.Xs_turn
def create_widgets(self):
self.Xs_turn = True #X goes first.
#self.square = [] #The square frame. Will become a 2D list.
self.status = [] #Whether the square is blank, an X, or an O.
self.button = [] #The button on the square.
self.letter = []
w = int(SQU_SIZE/5.55)
h = int(SQU_SIZE/11.7)
for i in range (3):
#self.squareColumn = []
self.statusColumn = []
self.buttonColumn = []
self.letterColumn = []
for j in range (3):
#miniFrame = Frame(self, width = w, height = h)
#self.squareColumn.append(miniFrame)
self.buttonColumn.append(Button(self, width = w, height = h,\
bg = BKGD, fg = FRGD))
#theButton.grid(row = j, column = i)
self.buttonColumn[j].grid(row = j, column = i)
#self.squareColumn[j].grid(row = j, column = i)
self.letterColumn.append(None)
#self.square.append(self.squareColumn)
self.button.append(self.buttonColumn)
self.letter.append(self.letterColumn)
for i in range (3):
for j in range (3):
self.button[i][j]['command'] = lambda x=i, y=j:\
self.show_letter(x,y, w,h)
def main():
root = Tk()
root.title('Tic-Tac-Toe')
dimens = int(SQU_SIZE*DILATION)
root.geometry(str(dimens) + 'x' + str(dimens))
game = App(root)
root.mainloop()
main()