Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.ru/hg/petri_dish/file/f55481ff4bb5/scale.py
Дата изменения: Unknown
Дата индексирования: Sun Feb 3 05:58:03 2013
Кодировка:
petri_dish: f55481ff4bb5 scale.py

petri_dish

view scale.py @ 21:f55481ff4bb5

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