petri_dish
diff scale.py @ 20:2df48c61bd42
now cells can move,reproduce
author | Yashina Ksenia <ksenia_yashina@kodomo.fbb.msu.ru> |
---|---|
date | Mon, 20 Dec 2010 01:44:18 +0300 |
parents | 9fa0119fa63c |
children | 69a4724e7cac |
line diff
1.1 --- a/scale.py Mon Dec 20 01:42:34 2010 +0300 1.2 +++ b/scale.py Mon Dec 20 01:44:18 2010 +0300 1.3 @@ -1,9 +1,12 @@ 1.4 from Tkinter import * 1.5 -import Bacteria 1.6 -import Petri 1.7 +from math import * 1.8 +import bacteria 1.9 +import petri 1.10 +import random 1.11 +import vector 1.12 1.13 class IF(object): 1.14 - def __init__(self,delay=10,diam=300,num=1,env=1,reprod_a=False,reprod_s=False,life=1): 1.15 + def __init__(self,delay=2,diam=300,num=1,env=1,reprod_a=False,reprod_s=False,life=1): 1.16 self.delay=delay 1.17 self.diam=diam 1.18 self.num=num 1.19 @@ -16,10 +19,14 @@ 1.20 return "<%s,%s,%s,%s,%s,%s,%s>"%(self.delay,self.diam,self.num,\ 1.21 self.env,self.reprod_a,\ 1.22 self.reprod_s,self.life) 1.23 - def mutate(): 1.24 - pass 1.25 + def mutate(self): 1.26 + for bact in p.bacteria: 1.27 + if not(bact.mutated): 1.28 + bact.mutated=True 1.29 + return 1.30 1.31 def sbmt(self): 1.32 + b=[] 1.33 submit.config(text="Stop",command=self.stop) 1.34 scl1.config(state=DISABLED) 1.35 scl2.config(state=DISABLED) 1.36 @@ -33,9 +40,25 @@ 1.37 filler=c.create_rectangle(0,0,self.diam+22,self.diam+22,fill="lightgrey") 1.38 c.grid(row=0,column=2,rowspan=6,padx=50,pady=10) 1.39 dish=c.create_oval(10,10,self.diam+10,self.diam+10,fill="white") 1.40 - print self 1.41 + for i in range(self.num): 1.42 + x_i=random.randint(-self.diam/2+15,self.diam/2-15) 1.43 + y_i=random.randint(15+(int)(-sqrt((self.diam/2)**2-x_i**2)),-15+(int)(sqrt((self.diam/2)**2-x_i**2))) 1.44 + b.append(bacteria.Bacteria(vector.Vector(x_i,y_i), 1.45 + vector.Vector(0,1), 1.46 + self.life,False)) 1.47 + for bact in b: 1.48 + bact.velocity = bact.rnd_velocity(pi/4*random.randrange(0,8)) 1.49 + p.num=self.num 1.50 + p.bacteria=b 1.51 + p.radius=self.diam/2 1.52 + p.delta=5 1.53 + p.bact_r=5 1.54 + p.full_lifetime=self.life 1.55 + self.depict() 1.56 1.57 def stop(self): 1.58 + c.after_cancel(self.rep) 1.59 + c.delete("all") 1.60 submit.config(text="Submit",command=self.sbmt) 1.61 scl1.config(state=NORMAL) 1.62 scl2.config(state=NORMAL) 1.63 @@ -58,18 +81,32 @@ 1.64 pass 1.65 1.66 def depict(self): 1.67 - pass 1.68 + c.delete("all") 1.69 + dish=c.create_oval(10,10,self.diam+10,self.diam+10,fill="white") 1.70 + env=scl.get() 1.71 + p.step(0.5,int(env),self.reprod_a,self.reprod_s) 1.72 + for bact in p.bacteria: 1.73 + if bact.mutated: 1.74 + color="black" 1.75 + else: 1.76 + color="white" 1.77 + c.create_oval(10+self.diam/2+bact.position.x-p.bact_r,10+self.diam/2+bact.position.y-p.bact_r,\ 1.78 + 10+self.diam/2+bact.position.x+p.bact_r*2,\ 1.79 + 10+self.diam/2+bact.position.y+p.bact_r*2,fill=color) 1.80 + self.rep=c.after(self.delay,self.depict) 1.81 1.82 -def update_scale(widget, times): 1.83 - value = widget.get() 1.84 - length = widget['to'] - widget['from'] 1.85 - value += length * times / 10 1.86 - widget.set(value) 1.87 + def update_scale(widget, times): 1.88 + value = widget.get() 1.89 + length = widget['to'] - widget['from'] 1.90 + value += length * times / 10 1.91 + widget.set(value) 1.92 1.93 root = Tk() 1.94 root.title("Interface") 1.95 intf=IF() 1.96 c=Canvas() 1.97 +p=petri.Petri() 1.98 +b=[] 1.99 1.100 root.bind_class("Scale", "<4>", lambda ev: update_scale(ev.widget, +1)) 1.101 root.bind_class("Scale", "<5>", lambda ev: update_scale(ev.widget, -1)) 1.102 @@ -98,7 +135,7 @@ 1.103 init_frame=LabelFrame(root,text="Initial parameters") 1.104 init_frame.grid(padx=15,pady=10) 1.105 scl1 = Scale(init_frame,orient=HORIZONTAL,length=100,from_=1,\ 1.106 - to=50,sliderlength=7,width=10) 1.107 + to=10,sliderlength=7,width=10) 1.108 scl1.grid(row=0, column=0,padx=10,pady=5) 1.109 lbl1 = Label(init_frame,text="number of cells",bg="white") 1.110 lbl1.grid(row=0,column=1,padx=10) 1.111 @@ -108,7 +145,7 @@ 1.112 lbl2 = Label(init_frame,text="diameter of Petri dish",bg="white") 1.113 lbl2.grid(row=1,column=1,padx=10) 1.114 scl3 = Scale(init_frame,orient=HORIZONTAL,length=100,from_=1,\ 1.115 - to=30,sliderlength=7,width=10) 1.116 + to=1000,sliderlength=7,width=10) 1.117 scl3.grid(row=2, column=0,padx=10,pady=5) 1.118 lbl3 = Label(init_frame,text="cells' lifetime",bg="white") 1.119 lbl3.grid(row=2,column=1,padx=10)