from Tkinter import * from math import sin, cos, pi from Vector import * class Arena(Frame): """This class provides the user interface for an arena of turtles.""" def __init__(self, parent, width=400, height=400, **options): Frame.__init__(self, parent, **options) self.width, self.height = width, height self.canvas = Canvas(self, width=width, height=height) self.canvas.pack() parent.title("UC Bereley CS9H Turtle Arena") Button(self, text='step', command=self.step).pack(side=LEFT) Button(self, text='run', command=self.run).pack(side=LEFT) Button(self, text='stop', command=self.stop).pack(side=LEFT) Button(self, text='quit', command=parent.quit).pack(side=LEFT) self.turtles = [] self.items = {} self.running = 0 self.period = 10 # milliseconds self.canvas.bind('', self.press) self.canvas.bind('', self.motion) self.canvas.bind('', self.release) self.dragging = None def press(self, event): dragstart = Vector(event.x, event.y) for turtle in self.turtles: if (dragstart - turtle.position).length() < 10: self.dragging = turtle self.dragstart = dragstart self.start = turtle.position return def motion(self, event): drag = Vector(event.x, event.y) if self.dragging: self.dragging.position = self.start + drag - self.dragstart self.update(self.dragging) def release(self, event): self.dragging = None def update(self, turtle): """Update the drawing of a turtle according to the turtle object.""" item = self.items[turtle] vertices = [(v.x, v.y) for v in turtle.getshape()] self.canvas.coords(item, sum(vertices, ())) self.canvas.itemconfigure(item, **turtle.style) def add(self, turtle): """Add a new turtle to this arena.""" self.turtles.append(turtle) self.items[turtle] = self.canvas.create_polygon(0, 0) self.update(turtle) def step(self, stop=1): """Advance all the turtles one step.""" nextstates = {} for turtle in self.turtles: nextstates[turtle] = turtle.getnextstate() for turtle in self.turtles: turtle.setstate(nextstates[turtle]) self.update(turtle) if stop: self.running = 0 def run(self): """Start the turtles running.""" self.running = 1 self.loop() def loop(self): """Repeatedly advance all the turtles one step.""" self.step(0) if self.running: self.tk.createtimerhandler(self.period, self.loop) def stop(self): """Stop the running turtles.""" self.running = 0