hello pythonistas the script below plays tictactoe; everything works; but if i replace the block at the bottom
if True: <tkinter code> with this instead def function(): <tkinter code> function() then the tkinter callbacks don't work anymore; can anybody make sense of this? thanks if you can help peace stm ps: here's the code... ex, oh, blank = 'XO ' rows = [[3*i + j for j in range(3)] for i in range(3)] columns = [[3*i + j for i in range(3)] for j in range(3)] diagonals = [[3+3, 4, 5-3], [3-3, 4, 5+3]] lines = rows + columns + diagonals putmark = lambda board, square, mark: board[:square] + mark + board[square + 1:] getblanks = lambda board: [square for square in range(9) if board[square]==blank] getmover = lambda board: ex if board.count(ex)==board.count(oh) else oh getlines = lambda board: [[board[square] for square in line] for line in lines] getwinners = lambda board: [player for player in [ex, oh] if [player] * 3 in getlines(board)] def evaluate(board): winners = getwinners(board) mover = getmover(board) blanks = getblanks(board) value = (+1) if winners==[ex] else (-1) if winners==[oh] else 0 optimum = max if mover == ex else min if mover == oh else None if winners or not blanks: return value, [] values = [evaluate(putmark(board,square,mover))[0] for square in blanks] optimal = optimum(values) return optimal, [square for (index, square) in enumerate(blanks) if values[index]==optimal] isvalid = lambda board: len(getwinners(board)) < 2 and board.count(ex)-board.count(oh) in {0,1} cartesian = lambda strings: [''] if not strings else [x + ys for x in strings[0] for ys in cartesian(strings[1:])] getmoves = lambda: {board: evaluate(board)[1] for board in cartesian([marks] * 9) if isvalid(board)} def getmove(board): from random import choice blanks = getblanks(board) evens = [square for square in blanks if (square % 2)==0] return choice(evaluate(board)[1]) if len(blanks)<8 else 4 if 4 in blanks else choice(evens) def getdisplay(board): template = ' {} | {} | {} ' separator = '\n-----------\n' return separator.join(template.format(*(board[square] for square in row)) for row in rows) def getstatus(board): winners = getwinners(board) numblanks = board.count(blank) if winners: return winners[0] + ' wins' if numblanks==0: return 'draw' if numblanks==9: return 'X goes first' else: return getmover(board) + ' goes next' show = lambda board: print('\n' + getdisplay(board) + '\n\n' + getstatus(board) + '\n') def newgame(): global board board = blank * 9 show(board) def makemove(): global board board = board if getwinners(board) or blank not in board else putmark(board, getmove(board), getmover(board)) show(board) def takemove(square): global board board = board if getwinners(board) or board[square] != blank else putmark(board, square, getmover(board)) show(board) show = lambda board: status.set(getstatus(board)) or [squares[i].set(board[i]) for i in range(9)] if True: from tkinter import Tk, Frame, Label, Button window = Tk() status = StringVar() squares = [StringVar() for i in range(9)] statusframe = Frame(window) buttonframe = Frame(window) boardframe = Frame(window) statuslabel = Label(statusframe) newgamebutton = Button(buttonframe) makemovebutton = Button(buttonframe) rowframes = [Frame(boardframe) for i in range(3)] squarebuttons = [Button(rowframes[i//3]) for i in range(9)] statuslabel .configure(textvariable=status) newgamebutton .configure(command=newgame, text='new game') makemovebutton .configure(command=makemove, text='make move') for i in range(9): squarebuttons[i] .configure(textvariable=squares[i], command=lambda i=i:takemove(i)) statuslabel .configure(padx=0, pady=10) boardframe .configure(padx=20, pady=20) for button in squarebuttons: button .configure(width=4, height=2) boardframe .pack(side=TOP) buttonframe .pack(side=TOP) statusframe .pack(side=TOP) newgamebutton .pack(side=LEFT) makemovebutton .pack(side=RIGHT) statuslabel .pack(side=TOP) for frame in rowframes: frame .pack(side=TOP) for button in squarebuttons: button .pack(side=LEFT) newgame() window.title(' tictactoe') window.mainloop() """ #)---------------------------------------- """ #)---------------------------------------- -- https://mail.python.org/mailman/listinfo/python-list