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).
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 :)


#!/usr/bin/python
# Filename: gol.py

import time
from Tkinter import *
import threading

class Gol:
    '''A board for the game of life'''
    def __init__(self, master):
        import random
        length = 10
        aa = []
        self.braet = []
        self.updated = []
        for i in range(length):
            aa.append(False)
        for i in range(length):
            self.braet.append(aa[:])
            self.updated.append(aa[:])

        # Makes a number of cells alive
        for i in range(length*2):
            et = random.randrange(length)
            to = random.randrange(length)
            while self.braet[et][to]:
                et = random.randrange(length)
                to = random.randrange(length)
            self.braet[et][to] = True

        self.frame = Frame(master)
        self.frame.grid()
      
        # A dictionary with all the buttons
        self.dict = {}
        for i in range(length):
            for j in range(length):
                self.dict['%s%s' % (i, j)] = Button(sel.frame, text = '     ')
                self.dict['%s%s' % (i, j)].grid(row = i, column = j)

        opdater = threading.Thread(target = self.run)
        opdater.start()

    def show(self):
        '''Updates the board, showing the changes since last'''
        for i in range(len(self.braet)):
            for j in range(len(self.braet[i])):
                if self.braet[i][j]:
                    self.dict['%s%s' % (i, j)].config(text = ' X ')
                else:
                    self.dict['%s%s' % (i, j)].config(text = '     ')

    def run(self):
        '''Runs the program, continually updating the board'''
        while True:
            self.show()
            time.sleep(1)
            self.update()

    def update(self):
        '''Updates the board
        If the cell has 3 live neighbors, it lives. Otherwise it dies'''

       # LONG batch of if-sentences, to check how many "neighbours" the cell has. Could probably be done in a better day

        for i in range(len(self.updated)):
            for j in range(len(self.updated[i])):
                self.updated[i][j] = 0
        for raekke in range(len(self.braet)):
            for celle in range(len(self.braet[raekke])):
                cellmates = 0

                # Way to many if sentences...
                if raekke == 0 or raekke == len(self.braet)-1:
                    if celle == 0:
                        if raekke == 0:
                            if self.braet[raekke][celle+1]:
                                cellmates += 1
                            if self.braet[raekke+1][celle]:
                                cellmates += 1
                            if self.braet[raekke+1][celle+1]:
                                cellmates += 1

                        elif raekke == len(self.braet)-1:
                            if self.braet[raekke][celle+1]:
                                cellmates += 1
                            if self.braet[raekke-1][celle]:
                                cellmates += 1
                            if self.braet[raekke-1][celle+1]:
                                cellmates += 1

                    elif celle == len(self.braet[raekke])-1:
                        if raekke == 0:
                            if self.braet[raekke][celle-1]:
                                cellmates += 1
                            if self.braet[raekke+1][celle]:
                                cellmates += 1
                            if self.braet[raekke+1][celle-1]:
                                cellmates += 1

                        elif raekke == len(self.braet)-1:
                            if self.braet[raekke][celle-1]:
                                cellmates += 1
                            if self.braet[raekke-1][celle]:
                                cellmates += 1
                            if self.braet[raekke-1][celle-1]:
                                cellmates += 1
                    
                    else:
                        if raekke == 0:
                            if self.braet[raekke][celle-1]:
                                cellmates += 1
                            if self.braet[raekke][celle+1]:
                                cellmates += 1
                            if self.braet[raekke+1][celle-1]:
                                cellmates += 1
                            if self.braet[raekke+1][celle]:
                                cellmates += 1
                            if self.braet[raekke+1][celle+1]:
                                cellmates += 1

                        elif raekke == len(self.braet)-1:
                            if self.braet[raekke][celle-1]:
                                cellmates += 1
                            if self.braet[raekke][celle+1]:
                                cellmates += 1
                            if self.braet[raekke-1][celle-1]:
                                cellmates += 1
                            if self.braet[raekke-1][celle]:
                                cellmates += 1
                            if self.braet[raekke-1][celle+1]:
                                cellmates += 1
                
                elif celle == 0 or celle == len(self.braet[raekke])-1:
                    if celle == 0:
                        if self.braet[raekke-1][celle+1]:
                            cellmates += 1
                        if self.braet[raekke-1][celle]:
                            cellmates += 1
                        if self.braet[raekke][celle+1]:
                            cellmates += 1
                        if self.braet[raekke+1][celle+1]:
                            cellmates += 1
                        if self.braet[raekke+1][celle]:
                            cellmates += 1

                    elif celle == len(self.braet[raekke])-1:
                        if self.braet[raekke-1][celle-1]:
                            cellmates += 1
                        if self.braet[raekke-1][celle]:
                            cellmates += 1
                        if self.braet[raekke][celle-1]:
                            cellmates += 1
                        if self.braet[raekke+1][celle-1]:
                            cellmates += 1
                        if self.braet[raekke+1][celle]:
                            cellmates += 1

                else:
                    if self.braet[raekke-1][celle-1]:
                        cellmates += 1
                    if self.braet[raekke-1][celle]:
                        cellmates += 1
                    if self.braet[raekke-1][celle+1]:
                        cellmates += 1
                    if self.braet[raekke][celle-1]:
                        cellmates += 1
                    if self.braet[raekke][celle+1]:
                        cellmates += 1
                    if self.braet[raekke+1][celle-1]:
                        cellmates += 1
                    if self.braet[raekke+1][celle]:
                        cellmates += 1
                    if self.braet[raekke+1][celle+1]:
                        cellmates += 1

                self.updated[raekke][celle] = cellmates

        # Updates the board, setting the cells to true or false
        for i in range(len(self.updated)):
            for j in range(len(self.updated[i])):
                if self.updated[i][j] == 3:
                    self.braet[i][j] = True
                elif self.updated[i][j] == 2:
                    pass
                else:
                    self.braet[i][j] = False

root = Tk()
app = Gol(root)
root.mainloop()
_______________________________________________
Tutor maillist  -  Tutor@python.org
http://mail.python.org/mailman/listinfo/tutor

Reply via email to