
Thanks, too, John! By changing 2 or 3 lines in Kirbys code I arrived at a tiny animation. (attachment). It's intended to run from the command line. Question: The raw_input() in line 70 seems to be indispensable. It doesn't work without it. Why is this the case? Regards, Gregor
""" Kirby Urners nks.py using Tkinter with tiny animation """ # uncomment one or the other, reload if switching from graphics import GraphWin, Point, Rectangle class Canvas(object): def __init__(self, width, rows, pixelsize): self.pixelsize = pixelsize self.c = GraphWin('NKS',width*pixelsize, rows*pixelsize, False) self.c.setBackground('black') def drawcell(self, thepoint): therow = thepoint[0]*self.pixelsize thecol = thepoint[1]*self.pixelsize therect = Rectangle(Point(therow, thecol), Point(therow + self.pixelsize-1, thecol + self.pixelsize-1)) therect.setFill('yellow') therect.setOutline('yellow') therect.draw(self.c) def showimage(self): self.c.flush() g = raw_input("Hit Enter on this line to close window") self.c.close() def base2(n,pad=8): output = [] while n > 1: digit = n%2 n //= 2 output.append(str(digit)) output.append(str(n)) output.reverse() return (''.join(output)).zfill(pad) def makerule(n): therule = {} output = base2(n) for i in range(8): therule[base2(7-i,3)] = output[i] return therule def sayrule(themap): for i in range(7,-1,-1): thekey = base2(i,3) print "%s --> %s" % (thekey, themap[thekey]) class Pattern(object): def __init__(self, n, width=40, rows=20, pixelsize = 1): self.width = width self.rule = makerule(n) self.therow = ('0' * (width//2) + '1' + '0' * (width - width//2 - 1)) self.rownum = 0 # Canvas imported from either of 2 modules self.canvas = Canvas(width,rows,pixelsize) self.canvas.c.flush() # <=== raw_input("Hit Enter to start automaton!") # <=== def next(self): while True: yield self.therow for i in range(len(self.therow)): if self.therow[i]=='1': self.canvas.drawcell((i,self.rownum)) newrow = ['0'] * len(self.therow) for i in range(1,len(self.therow)-1): thekey = (self.therow[i-1] + self.therow[i] + self.therow[i + 1]) newrow[i] = self.rule[thekey] self.therow = ''.join(newrow) self.rownum += 1 def showimage(self): self.canvas.showimage() def __iter__(self): return self.next() def t1(rule, width, height, pixelsize=1): p = Pattern(rule ,width, height, pixelsize) g = p.next() for i in range(width/2): g.next() p.canvas.c.flush() p.showimage() if __name__ == '__main__': t1(30,200,100,4)