from Tkinter import * import math import random class Vector: def __init__(self): r = range(1,5) self.x = random.choice(r) self.y = random.choice(r) self.Normalize() def Normalize(self): len = self.length() self.x /= len self.y /= len def length(self): return (math.sqrt(self.x*self.x + self.y*self.y)) class Circle(Frame): def __init__(self, parent): Frame.__init__(self) r = range(0,500) self.pack() self.center = (random.choice(r),random.choice(r)) r = range(0,30) self.radius = random.choice(r)+2 self.msecs = 1 self.vec = Vector() self.canvas = parent canvas.pack() self.physical = self.canvas.create_oval((self.center[0]-self.radius), (self.center[1]-self.radius), (self.center[0]+self.radius), (self.center[1]+self.radius), width=1) self.Animate() def Animate(self): self.canvas.move(self.physical,self.vec.x*2,self.vec.y*2) self.center = ((self.center[0]+self.vec.x*2),(self.center[1]+self.vec.y*2)) self.EdgeCollide() self.CirclesCollide() self.after(self.msecs,self.Animate) def CirclesCollide(self): global circles for c in circles: if c != self: #bounding box check if (abs(self.center[0]-c.center[0]) > (self.radius + c.radius)): continue if (abs(self.center[1]-c.center[1]) > (self.radius + c.radius)): continue #distance formula check if ((c.center[0]-self.center[0])*(c.center[0]-self.center[0]) + (c.center[1]-self.center[1])*(c.center[1]-self.center[1]) < (self.radius+c.radius)*(self.radius+c.radius)): #calculate new direction self.vec.x = (-self.vec.x) + (self.center[0] - c.center[0]) self.vec.y = (-self.vec.y) + (self.center[1] - c.center[1]) self.vec.Normalize() def EdgeCollide(self): #left if ((self.center[0]-self.radius) <= 0): if (self.vec.x < 0): self.vec.x *= -1 #right if ((self.center[0]+self.radius) >= 500): if (self.vec.x > 0): self.vec.x *= -1 #top if ((self.center[1]-self.radius) <= 0): if (self.vec.y < 0): self.vec.y *= -1 #bottom if ((self.center[1]+self.radius) >= 500): if (self.vec.y > 0): self.vec.y *= -1 #globals bucketsOn=1 circles = [] ########################################################### # Name: showBuckets # Purpose: toggle the display of the buckets on and off ########################################################### def showBuckets(): global bucketsOn if bucketsOn: bucketsOn=0 else: bucketsOn=1 #code execution starts here if __name__ == '__main__': root = Tk() #create the canvas for the circles to exist in canvas = Canvas(root, width=500, height=500, bg='white') canvas.pack(expand=YES, fill=BOTH) #create the menu top = Menu(root) root.config(menu=top) file=Menu(top) #File menu file.add_command(label='Quit', command=root.quit, underline=0) top.add_cascade(label='File', menu=file, underline=0) options=Menu(top) options.add_command(label='Show Buckets', command=showBuckets, underline=0) top.add_cascade(label='Options', menu=options, underline=0) #create the circles r=range(0,30) for i in r: circles.append(Circle(canvas)) root.mainloop()