<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><title></title></head><body>I'm trying just for fun to do a Game of life GUI, and want it to be a random size (later specified through some text field or something).<br />So far it's working, but now I want to make each button clickable, so the button switches between true or false. But I can't find out how to do it. So any help would be appreciated, as well as any improvement in code :)<br /><br /><br />#!/usr/bin/python<br /># Filename: gol.py<br /><br />import time<br />from Tkinter import *<br />import threading<br /><br />class Gol:<br /> '''A board for the game of life'''<br /> def __init__(self, master):<br /> import random<br /> length = 10<br /> aa = []<br /> self.braet = []<br /> self.updated = []<br /> for i in range(length):<br /> aa.append(False)<br /> for i in range(length):<br /> self.braet.append(aa[:])<br /> self.updated.append(aa[:])<br /><br /> # Makes a number of cells alive<br /> for i in range(length*2):<br /> et = random.randrange(length)<br /> to = random.randrange(length)<br /> while self.braet[et][to]:<br /> et = random.randrange(length)<br /> to = random.randrange(length)<br /> self.braet[et][to] = True<br /><br /> self.frame = Frame(master)<br /> self.frame.grid()<br /> <br /> # A dictionary with all the buttons<br /> self.dict = {}<br /> for i in range(length):<br /> for j in range(length):<br /> self.dict['%s%s' % (i, j)] = Button(sel.frame, text = ' ')<br /> self.dict['%s%s' % (i, j)].grid(row = i, column = j)<br /><br /> opdater = threading.Thread(target = self.run)<br /> opdater.start()<br /><br /> def show(self):<br /> '''Updates the board, showing the changes since last'''<br /> for i in range(len(self.braet)):<br /> for j in range(len(self.braet[i])):<br /> if self.braet[i][j]:<br /> self.dict['%s%s' % (i, j)].config(text = ' X ')<br /> else:<br /> self.dict['%s%s' % (i, j)].config(text = ' ')<br /><br /> def run(self):<br /> '''Runs the program, continually updating the board'''<br /> while True:<br /> self.show()<br /> time.sleep(1)<br /> self.update()<br /><br /> def update(self):<br /> '''Updates the board<br /> If the cell has 3 live neighbors, it lives. Otherwise it dies'''<br /><br /> # LONG batch of if-sentences, to check how many "neighbours" the cell has. Could probably be done in a better day<br /><br /> for i in range(len(self.updated)):<br /> for j in range(len(self.updated[i])):<br /> self.updated[i][j] = 0<br /> for raekke in range(len(self.braet)):<br /> for celle in range(len(self.braet[raekke])):<br /> cellmates = 0<br /><br /> # Way to many if sentences...<br /> if raekke == 0 or raekke == len(self.braet)-1:<br /> if celle == 0:<br /> if raekke == 0:<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle+1]:<br /> cellmates += 1<br /><br /> elif raekke == len(self.braet)-1:<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle+1]:<br /> cellmates += 1<br /><br /> elif celle == len(self.braet[raekke])-1:<br /> if raekke == 0:<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle-1]:<br /> cellmates += 1<br /><br /> elif raekke == len(self.braet)-1:<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle-1]:<br /> cellmates += 1<br /> <br /> else:<br /> if raekke == 0:<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle+1]:<br /> cellmates += 1<br /><br /> elif raekke == len(self.braet)-1:<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle+1]:<br /> cellmates += 1<br /> <br /> elif celle == 0 or celle == len(self.braet[raekke])-1:<br /> if celle == 0:<br /> if self.braet[raekke-1][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /><br /> elif celle == len(self.braet[raekke])-1:<br /> if self.braet[raekke-1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /><br /> else:<br /> if self.braet[raekke-1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke-1][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke][celle+1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle-1]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle]:<br /> cellmates += 1<br /> if self.braet[raekke+1][celle+1]:<br /> cellmates += 1<br /><br /> self.updated[raekke][celle] = cellmates<br /><br /> # Updates the board, setting the cells to true or false<br /> for i in range(len(self.updated)):<br /> for j in range(len(self.updated[i])):<br /> if self.updated[i][j] == 3:<br /> self.braet[i][j] = True<br /> elif self.updated[i][j] == 2:<br /> pass<br /> else:<br /> self.braet[i][j] = False<br /><br />root = Tk()<br />app = Gol(root)<br />root.mainloop()</body></html>