[Edu-sig] re: new graphics.py etc.
John Zelle
john.zelle at wartburg.edu
Mon May 10 17:23:41 EDT 2004
Gregor Lingl wrote:
>
> 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?
Hmmm, this is a bit confusing to me too. I think the problem is that all
of the drawing is complete before Tk even creates the window (under
Windows that is; it works fine in Linux). If you change the
self.canvas.c.flush() to self.canvas.c.update() then the raw_input is
not needed. The difference is that flush() calls Tk's update_idletask()
rather than the more definite update. I need to look into the platform
differences on these calls. Most of the time, I am developing/testing
under Linux, so I used the weaker update, which seems to work fine there.
>
> 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)
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Edu-sig mailing list
>Edu-sig at python.org
>http://mail.python.org/mailman/listinfo/edu-sig
>
>
More information about the Edu-sig
mailing list