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() |