Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.su/hg/petri_dish/annotate/2df48c61bd42/scale.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 28 06:38:58 2014
Кодировка:
petri_dish: scale.py annotate

petri_dish

annotate 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
rev   line source
ksenia_yashina@8 1 from Tkinter import *
ksenia_yashina@20 2 from math import *
ksenia_yashina@20 3 import bacteria
ksenia_yashina@20 4 import petri
ksenia_yashina@20 5 import random
ksenia_yashina@20 6 import vector
ksenia_yashina@11 7
ksenia_yashina@13 8 class IF(object):
ksenia_yashina@20 9 def __init__(self,delay=2,diam=300,num=1,env=1,reprod_a=False,reprod_s=False,life=1):
ksenia_yashina@11 10 self.delay=delay
ksenia_yashina@11 11 self.diam=diam
ksenia_yashina@11 12 self.num=num
ksenia_yashina@11 13 self.env=env
ksenia_yashina@11 14 self.reprod_s=reprod_s
ksenia_yashina@11 15 self.reprod_a=reprod_a
ksenia_yashina@11 16 self.life=life
ksenia_yashina@11 17
ksenia_yashina@11 18 def __repr__(self):
ksenia_yashina@11 19 return "<%s,%s,%s,%s,%s,%s,%s>"%(self.delay,self.diam,self.num,\
ksenia_yashina@11 20 self.env,self.reprod_a,\
ksenia_yashina@11 21 self.reprod_s,self.life)
ksenia_yashina@20 22 def mutate(self):
ksenia_yashina@20 23 for bact in p.bacteria:
ksenia_yashina@20 24 if not(bact.mutated):
ksenia_yashina@20 25 bact.mutated=True
ksenia_yashina@20 26 return
ksenia_yashina@11 27
ksenia_yashina@11 28 def sbmt(self):
ksenia_yashina@20 29 b=[]
ksenia_yashina@11 30 submit.config(text="Stop",command=self.stop)
ksenia_yashina@11 31 scl1.config(state=DISABLED)
ksenia_yashina@11 32 scl2.config(state=DISABLED)
ksenia_yashina@11 33 scl3.config(state=DISABLED)
ksenia_yashina@11 34 cb1.config(state=DISABLED)
ksenia_yashina@11 35 cb2.config(state=DISABLED)
ksenia_yashina@11 36 self.num=scl1.get()
ksenia_yashina@11 37 self.diam=scl2.get()
ksenia_yashina@11 38 self.life=scl3.get()
ksenia_yashina@11 39 c.config(height=self.diam+20,width=self.diam+20,bg="gray75")
ksenia_yashina@11 40 filler=c.create_rectangle(0,0,self.diam+22,self.diam+22,fill="lightgrey")
ksenia_yashina@11 41 c.grid(row=0,column=2,rowspan=6,padx=50,pady=10)
ksenia_yashina@11 42 dish=c.create_oval(10,10,self.diam+10,self.diam+10,fill="white")
ksenia_yashina@20 43 for i in range(self.num):
ksenia_yashina@20 44 x_i=random.randint(-self.diam/2+15,self.diam/2-15)
ksenia_yashina@20 45 y_i=random.randint(15+(int)(-sqrt((self.diam/2)**2-x_i**2)),-15+(int)(sqrt((self.diam/2)**2-x_i**2)))
ksenia_yashina@20 46 b.append(bacteria.Bacteria(vector.Vector(x_i,y_i),
ksenia_yashina@20 47 vector.Vector(0,1),
ksenia_yashina@20 48 self.life,False))
ksenia_yashina@20 49 for bact in b:
ksenia_yashina@20 50 bact.velocity = bact.rnd_velocity(pi/4*random.randrange(0,8))
ksenia_yashina@20 51 p.num=self.num
ksenia_yashina@20 52 p.bacteria=b
ksenia_yashina@20 53 p.radius=self.diam/2
ksenia_yashina@20 54 p.delta=5
ksenia_yashina@20 55 p.bact_r=5
ksenia_yashina@20 56 p.full_lifetime=self.life
ksenia_yashina@20 57 self.depict()
ksenia_yashina@11 58
ksenia_yashina@11 59 def stop(self):
ksenia_yashina@20 60 c.after_cancel(self.rep)
ksenia_yashina@20 61 c.delete("all")
ksenia_yashina@11 62 submit.config(text="Submit",command=self.sbmt)
ksenia_yashina@11 63 scl1.config(state=NORMAL)
ksenia_yashina@11 64 scl2.config(state=NORMAL)
ksenia_yashina@11 65 scl3.config(state=NORMAL)
ksenia_yashina@11 66 cb1.config(state=NORMAL)
ksenia_yashina@11 67 cb2.config(state=NORMAL)
ksenia_yashina@11 68
ksenia_yashina@11 69 def new_reprod_a(self):
ksenia_yashina@11 70 self.reprod_a=not(self.reprod_a)
ksenia_yashina@11 71 return
ksenia_yashina@11 72
ksenia_yashina@11 73 def new_reprod_s(self):
ksenia_yashina@11 74 self.reprod_s=not(self.reprod_s)
ksenia_yashina@11 75 return
ksenia_yashina@13 76
ksenia_yashina@13 77 def help(self):
ksenia_yashina@13 78 pass
ksenia_yashina@13 79
ksenia_yashina@13 80 def pause(self):
ksenia_yashina@13 81 pass
ksenia_yashina@11 82
ksenia_yashina@13 83 def depict(self):
ksenia_yashina@20 84 c.delete("all")
ksenia_yashina@20 85 dish=c.create_oval(10,10,self.diam+10,self.diam+10,fill="white")
ksenia_yashina@20 86 env=scl.get()
ksenia_yashina@20 87 p.step(0.5,int(env),self.reprod_a,self.reprod_s)
ksenia_yashina@20 88 for bact in p.bacteria:
ksenia_yashina@20 89 if bact.mutated:
ksenia_yashina@20 90 color="black"
ksenia_yashina@20 91 else:
ksenia_yashina@20 92 color="white"
ksenia_yashina@20 93 c.create_oval(10+self.diam/2+bact.position.x-p.bact_r,10+self.diam/2+bact.position.y-p.bact_r,\
ksenia_yashina@20 94 10+self.diam/2+bact.position.x+p.bact_r*2,\
ksenia_yashina@20 95 10+self.diam/2+bact.position.y+p.bact_r*2,fill=color)
ksenia_yashina@20 96 self.rep=c.after(self.delay,self.depict)
ksenia_yashina@11 97
ksenia_yashina@20 98 def update_scale(widget, times):
ksenia_yashina@20 99 value = widget.get()
ksenia_yashina@20 100 length = widget['to'] - widget['from']
ksenia_yashina@20 101 value += length * times / 10
ksenia_yashina@20 102 widget.set(value)
me@18 103
ksenia_yashina@8 104 root = Tk()
ksenia_yashina@8 105 root.title("Interface")
ksenia_yashina@11 106 intf=IF()
ksenia_yashina@11 107 c=Canvas()
ksenia_yashina@20 108 p=petri.Petri()
ksenia_yashina@20 109 b=[]
ksenia_yashina@8 110
me@18 111 root.bind_class("Scale", "<4>", lambda ev: update_scale(ev.widget, +1))
me@18 112 root.bind_class("Scale", "<5>", lambda ev: update_scale(ev.widget, -1))
me@18 113
ksenia_yashina@13 114 menubar = Menu(root)
ksenia_yashina@13 115
ksenia_yashina@13 116 # create a pulldown menu, and add it to the menu bar
ksenia_yashina@13 117 controlsmenu = Menu(menubar, tearoff=0)
ksenia_yashina@13 118 controlsmenu.add_command(label="Start", command=intf.sbmt)
ksenia_yashina@13 119 controlsmenu.add_command(label="Stop", command=intf.stop)
ksenia_yashina@13 120 controlsmenu.add_command(label="Add mutation", command=intf.mutate)
ksenia_yashina@13 121 controlsmenu.add_separator()
ksenia_yashina@13 122 controlsmenu.add_command(label="Exit", command=root.destroy)
ksenia_yashina@13 123 #controlmenu.add_command(label="Pause", command=intf.pause)
ksenia_yashina@13 124 menubar.add_cascade(label="Controls", menu=controlsmenu)
ksenia_yashina@13 125
ksenia_yashina@13 126 helpmenu = Menu(menubar, tearoff=0)
ksenia_yashina@13 127 helpmenu.add_command(label="About", command=intf.help)
ksenia_yashina@13 128 menubar.add_cascade(label="Help", menu=helpmenu)
ksenia_yashina@13 129
ksenia_yashina@13 130 # display the menu
ksenia_yashina@13 131 root.config(menu=menubar)
ksenia_yashina@13 132
ksenia_yashina@13 133
ksenia_yashina@13 134
ksenia_yashina@8 135 init_frame=LabelFrame(root,text="Initial parameters")
ksenia_yashina@8 136 init_frame.grid(padx=15,pady=10)
ksenia_yashina@10 137 scl1 = Scale(init_frame,orient=HORIZONTAL,length=100,from_=1,\
ksenia_yashina@20 138 to=10,sliderlength=7,width=10)
ksenia_yashina@10 139 scl1.grid(row=0, column=0,padx=10,pady=5)
ksenia_yashina@10 140 lbl1 = Label(init_frame,text="number of cells",bg="white")
ksenia_yashina@10 141 lbl1.grid(row=0,column=1,padx=10)
ksenia_yashina@11 142 scl2 = Scale(init_frame,orient=HORIZONTAL,length=100,from_=100,\
ksenia_yashina@10 143 to=500,sliderlength=7,width=10)
ksenia_yashina@10 144 scl2.grid(row=1, column=0,padx=10,pady=5)
ksenia_yashina@10 145 lbl2 = Label(init_frame,text="diameter of Petri dish",bg="white")
ksenia_yashina@10 146 lbl2.grid(row=1,column=1,padx=10)
ksenia_yashina@10 147 scl3 = Scale(init_frame,orient=HORIZONTAL,length=100,from_=1,\
ksenia_yashina@20 148 to=1000,sliderlength=7,width=10)
ksenia_yashina@10 149 scl3.grid(row=2, column=0,padx=10,pady=5)
ksenia_yashina@10 150 lbl3 = Label(init_frame,text="cells' lifetime",bg="white")
ksenia_yashina@10 151 lbl3.grid(row=2,column=1,padx=10)
ksenia_yashina@8 152 lbl_frame=LabelFrame(init_frame,text="Reproduction")
ksenia_yashina@8 153 lbl_frame.grid(row=4,column=0,columnspan=2,padx=15,pady=10)
ksenia_yashina@8 154 list=["Asexual","Sexual"]
ksenia_yashina@11 155 cb1 = Checkbutton(lbl_frame,text="Asexual",command=intf.new_reprod_a)
ksenia_yashina@10 156 cb1.pack()
ksenia_yashina@11 157 cb2 = Checkbutton(lbl_frame,text="Sexual",command=intf.new_reprod_s)
ksenia_yashina@10 158 cb2.pack()
ksenia_yashina@10 159
ksenia_yashina@11 160 submit=Button(root,text="Submit",width=25,command=intf.sbmt)
ksenia_yashina@8 161 submit.grid(row=1,column=0,columnspan=2,pady=10)
ksenia_yashina@8 162
ksenia_yashina@11 163 chng_frame=LabelFrame(root,text="Changeable parameters")
ksenia_yashina@8 164 chng_frame.grid(padx=15,pady=10)
ksenia_yashina@8 165 scl = Scale(chng_frame,orient=HORIZONTAL,length=100,from_=1,\
ksenia_yashina@8 166 to=100,sliderlength=7,width=10)
ksenia_yashina@8 167 scl.grid(row=0, column=0,padx=10,pady=5)
ksenia_yashina@8 168 lbl = Label(chng_frame,text="environment",bg="white")
ksenia_yashina@8 169 lbl.grid(row=0,column=1,padx=10)
ksenia_yashina@13 170 btn = Button(chng_frame,text="Add mutation",width=25,command=intf.mutate)
ksenia_yashina@8 171 btn.grid(row=1,column=0,columnspan=2,pady=10)
ksenia_yashina@8 172
ksenia_yashina@11 173 #root.after(intf.delay,intf.depict())
ksenia_yashina@11 174
ksenia_yashina@8 175 mainloop()