[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