rev |
line source |
Ilia@6
|
1 from Tkinter import * |
Ilia@2
|
2 |
Ilia@2
|
3 class Handlers(object): |
is_rusinov@5
|
4 |
is_rusinov@8
|
5 def __init__(self, cell_size=5, delay=10, offset_x=0, offset_y=0):# cell_size is size of cell, including line width, if there is it |
is_rusinov@7
|
6 self.cell_size = cell_size |
is_rusinov@7
|
7 self.delay = delay |
Ilia@6
|
8 self.offset_x = offset_x |
Ilia@6
|
9 self.offset_y = offset_y |
is_rusinov@5
|
10 self.after_id = 0 |
is_rusinov@7
|
11 self.is_started = False |
is_rusinov@5
|
12 |
is_rusinov@5
|
13 def start(self): |
is_rusinov@8
|
14 if not self.is_started: |
is_rusinov@7
|
15 self.is_started = True |
is_rusinov@7
|
16 self.next_step() |
is_rusinov@7
|
17 self.after_id = canvas.after(self.delay, self.start) |
is_rusinov@5
|
18 |
is_rusinov@5
|
19 def stop(self): |
is_rusinov@5
|
20 self.canvas.after_cancel(self.after_id) |
is_rusinov@7
|
21 self.is_started = False |
is_rusinov@5
|
22 |
is_rusinov@5
|
23 def next_step(self): |
is_rusinov@7
|
24 automata.next_step() |
is_rusinov@5
|
25 self.draw() |
is_rusinov@5
|
26 |
is_rusinov@5
|
27 def save_file(): |
Ilia@2
|
28 pass |
is_rusinov@5
|
29 |
is_rusinov@5
|
30 def open_file(): |
Ilia@2
|
31 pass |
is_rusinov@5
|
32 |
Ilia@2
|
33 def help(): |
Ilia@2
|
34 pass |
is_rusinov@5
|
35 |
is_rusinov@5
|
36 def close_help_window |
is_rusinov@8
|
37 pass |
is_rusinov@8
|
38 |
is_rusinov@8
|
39 def zoom_in(self, zoom_rate=1): |
is_rusinov@7
|
40 if self.cell_size < 50: |
is_rusinov@8
|
41 self.cell_size = self.cell_size + zoom_rate |
is_rusinov@7
|
42 self.draw() |
is_rusinov@5
|
43 |
is_rusinov@8
|
44 def zoom_out(self, zoom_rate=1): |
is_rusinov@7
|
45 if self.cell_size > 1: |
is_rusinov@8
|
46 self.cell_size = self.cell_size - zoom_rate |
is_rusinov@7
|
47 self.draw() |
is_rusinov@5
|
48 |
is_rusinov@8
|
49 def slower(self, speed_rate=1): |
is_rusinov@7
|
50 self.delay = self.delay + speed_rate |
is_rusinov@5
|
51 |
is_rusinov@8
|
52 def faster(self, speed_rate=1): |
is_rusinov@7
|
53 if self.speed > speed_rate: |
is_rusinov@7
|
54 self.delay = self.delay - speed_rate |
is_rusinov@7
|
55 else: |
is_rusinov@7
|
56 self.delay = 0 |
is_rusinov@5
|
57 |
is_rusinov@8
|
58 def change_size(dx, dy, position=0): |
is_rusinov@8
|
59 if position < 9: |
is_rusinov@8
|
60 if position == 0 or position == 3 or position == 6: |
is_rusinov@8
|
61 automata.change_size(dx, 3) |
is_rusinov@8
|
62 elif position == 1 or position == 4 or position == 7: |
is_rusinov@8
|
63 automata.change_size(dx / 2, 3) |
is_rusinov@8
|
64 automata.change_size(dx - dx / 2, 1) |
is_rusinov@8
|
65 else |
is_rusinov@8
|
66 automata.change_size(dx, 1) |
is_rusinov@8
|
67 if position == 0 or position == 1 or position == 2: |
is_rusinov@8
|
68 automata.change_size(dy, 0) |
is_rusinov@8
|
69 elif position == 3 or position == 4 or position == 5: |
is_rusinov@8
|
70 automata.change_size(dy / 2, 0) |
is_rusinov@8
|
71 automata.change_size(dy - dy / 2, 2) |
is_rusinov@8
|
72 else |
is_rusinov@8
|
73 automata.change_size(dy, 2) |
is_rusinov@8
|
74 self.draw() |
is_rusinov@5
|
75 |
Ilia@2
|
76 def draw(): |
Ilia@2
|
77 pass |
is_rusinov@5
|
78 |
is_rusinov@7
|
79 def press1(self, event):# drawer |
Ilia@2
|
80 pass |
is_rusinov@5
|
81 |
is_rusinov@7
|
82 def motion1(self, event):# drawer |
Ilia@2
|
83 pass |
is_rusinov@5
|
84 |
is_rusinov@7
|
85 def press3(self, event):# drawer |
Ilia@2
|
86 pass |
is_rusinov@5
|
87 |
is_rusinov@7
|
88 def motion3(self, event):# drawer |
Ilia@2
|
89 pass |
is_rusinov@5
|
90 |
is_rusinov@7
|
91 def press_key1(self, event):# drawer+change_scale (B1+ctrl) |
Ilia@2
|
92 pass |
is_rusinov@5
|
93 |
is_rusinov@7
|
94 def motion_key1(self, event):# drawer+change_scale (B1+ctrl) |
Ilia@2
|
95 pass |
is_rusinov@5
|
96 |
is_rusinov@7
|
97 def press12(self, event):# zoom |
Ilia@2
|
98 pass |
is_rusinov@5
|
99 |
is_rusinov@7
|
100 def motion12(self, event):# zoom |
Ilia@2
|
101 pass |
is_rusinov@5
|
102 |
is_rusinov@8
|
103 def automata_frame(self):# show automata_frame |
Ilia@9
|
104 automata_frame.pack(side="right", fill="y", expand="no", before=canvas) |
is_rusinov@7
|
105 |
is_rusinov@8
|
106 def to_top(self):# replace choosen state to top |
is_rusinov@7
|
107 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
108 state = states[index] |
is_rusinov@7
|
109 del states[index] |
is_rusinov@7
|
110 states.insert(0, state) |
is_rusinov@7
|
111 |
is_rusinov@8
|
112 def to_bottom(self):# replace choosen state to botton |
is_rusinov@7
|
113 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
114 state = states[index] |
is_rusinov@7
|
115 del states[index] |
is_rusinov@7
|
116 states.append(state) |
is_rusinov@7
|
117 |
is_rusinov@8
|
118 def upwards(self): |
is_rusinov@7
|
119 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
120 state = states[index] |
is_rusinov@7
|
121 del states[index] |
is_rusinov@7
|
122 states.insert(index - 1, state) |
is_rusinov@7
|
123 |
is_rusinov@8
|
124 def downwards(self): |
is_rusinov@7
|
125 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
126 state = states[index] |
is_rusinov@7
|
127 del states[index] |
is_rusinov@7
|
128 states.insert(index + 1, state) |
is_rusinov@7
|
129 |
is_rusinov@8
|
130 def delete_state(self):# delete choosen state |
is_rusinov@7
|
131 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
132 del states[index] |
is_rusinov@7
|
133 |
is_rusinov@7
|
134 def add():# add new state |
Ilia@2
|
135 pass |
is_rusinov@5
|
136 |
is_rusinov@7
|
137 def change():# change chosen state |
Ilia@2
|
138 pass |
is_rusinov@5
|
139 |
Ilia@6
|
140 |
Ilia@6
|
141 |
Ilia@6
|
142 root = Tk() |
Ilia@6
|
143 root.title("Cyclyc Cell Automata") |
Ilia@6
|
144 |
Ilia@6
|
145 canvas = Canvas(root, background="white") |
Ilia@6
|
146 canvas.config(width=500, height=400) |
Ilia@6
|
147 canvas.pack(fill="both", expand="yes") |
Ilia@6
|
148 |
Ilia@6
|
149 automata = Automata() |
Ilia@6
|
150 handlers = Handlers(1, 1, 0, 0) |
Ilia@6
|
151 |
Ilia@6
|
152 states = [] |
Ilia@6
|
153 symboles = dict() |
Ilia@6
|
154 |
Ilia@6
|
155 #infoPanel=Frame |
Ilia@9
|
156 automata_frame=Frame(root, background="grey") |
Ilia@9
|
157 |
Ilia@9
|
158 headline_frame=Frame(automata_frame, background="white") |
Ilia@9
|
159 head = Label(headline_frame, text= "Automata Panel", font=16) |
Ilia@9
|
160 head.pack(side="left", expand="yes") |
Ilia@9
|
161 hide = Button(headline_frame, text="X", command=automata_frame.forget) |
Ilia@9
|
162 hide.config(bg="grey") |
Ilia@9
|
163 hide.pack(side="right") |
Ilia@9
|
164 headline_frame.pack(side="top",fill="both", expand="no") |
Ilia@9
|
165 |
Ilia@9
|
166 Label(automata_frame, text= "State Box:").pack(side="top", fill="x") |
Ilia@9
|
167 state_list=Listbox(automata_frame, selectmode="extended") |
Ilia@6
|
168 for state in states: |
is_rusinov@7
|
169 state_list.insert("end", state) |
is_rusinov@7
|
170 state_list.pack(side="top", fill="y") |
Ilia@9
|
171 up = Button(automata_frame, text="Up", state="DISABLED") |
Ilia@6
|
172 up.config(bg="red") |
Ilia@9
|
173 down = Button(automata_frame, text="Down", state="DISABLED") |
Ilia@6
|
174 down.config(bg="orange") |
Ilia@9
|
175 to_top = Button(automata_frame, text="To Top", state="DISABLED") |
Ilia@6
|
176 to_top.config(bg="yellow") |
Ilia@9
|
177 to_bottom = Button(automata_frame, text="To Bottom", state="DISABLED") |
Ilia@6
|
178 to_bottom.config(bg="green") |
Ilia@12
|
179 delete = Button(automata_frame, text="Delete", state="DISABLED") |
Ilia@9
|
180 delete.config(bg="cyan") |
Ilia@6
|
181 up.pack(side="top", fill="x") |
Ilia@6
|
182 down.pack(side="top", fill="x") |
Ilia@6
|
183 to_top.pack(side="top", fill="x") |
Ilia@6
|
184 to_bottom.pack(side="top", fill="x") |
Ilia@9
|
185 delete.pack(side="top", fill="x") |
Ilia@9
|
186 |
Ilia@9
|
187 |
Ilia@9
|
188 information = Label(automata_frame, text= "Information of State") |
Ilia@9
|
189 information.pack(side="top", fill="x") |
Ilia@9
|
190 info_frame=Frame(automata_frame, background="white") |
Ilia@9
|
191 Label(info_frame, text="Name").grid(row=0, column=0) |
Ilia@9
|
192 state_name = Entry(info_frame) |
Ilia@9
|
193 state_name.grid(row=0, column=1) |
Ilia@9
|
194 Label(info_frame, text="Symbol").grid(row=1, column=0) |
Ilia@9
|
195 state_symbol = Entry(info_frame) |
Ilia@9
|
196 state_symbol.grid(row=1, column=1) |
Ilia@9
|
197 Label(info_frame, text="Color").grid(row=2, column=0) |
Ilia@9
|
198 state_color = Entry(info_frame) |
Ilia@9
|
199 state_color.grid(row=2, column=1) |
Ilia@9
|
200 Label(info_frame, text="Key").grid(row=3, column=0) |
Ilia@9
|
201 state_key = Entry(info_frame) |
Ilia@9
|
202 state_key.grid(row=3, column=1) |
Ilia@9
|
203 info_frame.pack(side="top") |
Ilia@9
|
204 |
Ilia@9
|
205 |
Ilia@9
|
206 condition = Label(automata_frame, text= "Condition of conversion") |
Ilia@9
|
207 condition.pack(side="top", fill="x") |
Ilia@9
|
208 condition_frame=Frame(automata_frame, background="white") |
Ilia@9
|
209 Label(condition_frame, text="0: ").grid(row=0, column=0) |
Ilia@9
|
210 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
211 check_box_0.grid(row=0, column=1) |
Ilia@9
|
212 Label(condition_frame, text="1: ").grid(row=0, column=2) |
Ilia@9
|
213 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
214 check_box_1.grid(row=0, column=3) |
Ilia@9
|
215 Label(condition_frame, text="2: ").grid(row=0, column=4) |
Ilia@9
|
216 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
217 check_box_2.grid(row=0, column=5) |
Ilia@9
|
218 Label(condition_frame, text="3: ").grid(row=1, column=0) |
Ilia@9
|
219 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
220 check_box_0.grid(row=1, column=1) |
Ilia@9
|
221 Label(condition_frame, text="4: ").grid(row=1, column=2) |
Ilia@9
|
222 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
223 check_box_1.grid(row=1, column=3) |
Ilia@9
|
224 Label(condition_frame, text="5: ").grid(row=1, column=4) |
Ilia@9
|
225 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
226 check_box_2.grid(row=1, column=5) |
Ilia@9
|
227 Label(condition_frame, text="6: ").grid(row=2, column=0) |
Ilia@9
|
228 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
229 check_box_0.grid(row=2, column=1) |
Ilia@9
|
230 Label(condition_frame, text="7: ").grid(row=2, column=2) |
Ilia@9
|
231 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
232 check_box_1.grid(row=2, column=3) |
Ilia@9
|
233 Label(condition_frame, text="8: ").grid(row=2, column=4) |
Ilia@9
|
234 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
235 check_box_2.grid(row=2, column=5) |
Ilia@9
|
236 condition_frame.pack(side="top") |
Ilia@9
|
237 |
Ilia@9
|
238 |
Ilia@12
|
239 add_state = Button(automata_frame, text="ADD", state="DISABLED") |
Ilia@9
|
240 add_state.config(bg="blue") |
Ilia@12
|
241 change_state = Button(automata_frame, text="Change", state="DISABLED") |
Ilia@9
|
242 change_state.config(bg="violet") |
Ilia@9
|
243 add_state.pack(side="top", fill="x") |
Ilia@9
|
244 change_state.pack(side="top", fill="x") |
Ilia@9
|
245 |
Ilia@9
|
246 error=Label(automata_frame) |
Ilia@9
|
247 error.pack(side="top", fill="x") |
Ilia@6
|
248 |
Ilia@6
|
249 |
Ilia@12
|
250 side = 0 |
Ilia@12
|
251 |
Ilia@12
|
252 size_window = Toplevel(root) |
Ilia@12
|
253 size_window.title("") |
Ilia@12
|
254 size_window.protocol("WM_DELETE_WINDOW", handlers.hide_size_window) |
Ilia@12
|
255 Label(size_window, text= "Current size of window:").pack(side="top", fill="x") |
Ilia@12
|
256 Label(size_window, text= "X x Y").pack(side="top", fill="x") |
Ilia@12
|
257 Label(size_window, text= "New size:").pack(side="top", fill="x") |
Ilia@12
|
258 new_size = Frame(size_window) |
Ilia@12
|
259 size_x = Entry(new_size, width=5) |
Ilia@12
|
260 size_x.grid(row=0, column=0) |
Ilia@12
|
261 Label(new_size, text=" x ").grid(row=0, column=1) |
Ilia@12
|
262 size_y = Entry(new_size, width=5) |
Ilia@12
|
263 size_y.grid(row=0, column=2) |
Ilia@12
|
264 new_size.pack(side="top") |
Ilia@12
|
265 Label(size_window, text= "Expansion of window:").pack(side="top", fill="x") |
Ilia@12
|
266 expansion = Frame(size_window) |
Ilia@12
|
267 r0 = Radiobutton(expansion, variable=side, value = 0, indicatoron=0, width=2, height=1) |
Ilia@12
|
268 r0.select() |
Ilia@12
|
269 r0.grid(row=0, column=0) |
Ilia@12
|
270 r1 = Radiobutton(expansion, variable=side, value = 1, indicatoron=0, width=2, height=1) |
Ilia@12
|
271 r1.grid(row=0, column=1) |
Ilia@12
|
272 r2 = Radiobutton(expansion, variable=side, value = 2, indicatoron=0, width=2, height=1) |
Ilia@12
|
273 r2.grid(row=0, column=2) |
Ilia@12
|
274 r3 = Radiobutton(expansion, variable=side, value = 3, indicatoron=0, width=2, height=1) |
Ilia@12
|
275 r3.grid(row=1, column=0) |
Ilia@12
|
276 r4 = Radiobutton(expansion, variable=side, value = 4, indicatoron=0, width=2, height=1) |
Ilia@12
|
277 r4.grid(row=1, column=1) |
Ilia@12
|
278 r5 = Radiobutton(expansion, variable=side, value = 5, indicatoron=0, width=2, height=1) |
Ilia@12
|
279 r5.grid(row=1, column=2) |
Ilia@12
|
280 r6 = Radiobutton(expansion, variable=side, value = 6, indicatoron=0, width=2, height=1) |
Ilia@12
|
281 r6.grid(row=2, column=0) |
Ilia@12
|
282 r7 = Radiobutton(expansion, variable=side, value = 7, indicatoron=0, width=2, height=1) |
Ilia@12
|
283 r7.grid(row=2, column=1) |
Ilia@12
|
284 r8 = Radiobutton(expansion, variable=side, value = 8, indicatoron=0, width=2, height=1) |
Ilia@12
|
285 r8.grid(row=2, column=2) |
Ilia@12
|
286 expansion.pack(side="top") |
Ilia@12
|
287 Label(size_window).pack(side="top", fill="x") |
Ilia@12
|
288 apply_frame = Frame(size_window, padx=10, pady=5) |
Ilia@12
|
289 apply_size = Button(apply_frame, text="Apply") |
Ilia@12
|
290 apply_size.config(bg="yellow") |
Ilia@12
|
291 apply_size.pack(side="left", fill="x") |
Ilia@12
|
292 close_size = Button(apply_frame, text="Close", command=handlers.hide_size_window) |
Ilia@12
|
293 close_size.config(bg="green") |
Ilia@12
|
294 close_size.pack(side="right", fill="x") |
Ilia@12
|
295 apply_frame.pack(side="top", fill="x") |
Ilia@12
|
296 |
Ilia@6
|
297 menubar = Menu(root) |
Ilia@6
|
298 root.config(menu=menubar) |
Ilia@6
|
299 |
Ilia@6
|
300 menu_file = Menu(menubar) |
Ilia@6
|
301 menu_file.add_command(label="New") |
Ilia@9
|
302 menu_file.add_command(label="Open...", command=handlers.open_file) |
Ilia@9
|
303 menu_file.add_command(label="Save...", command=handlers.save_file) |
Ilia@6
|
304 menu_file.add_separator() |
Ilia@9
|
305 menu_file.add_command(label="Exit", command=root.destroy) |
Ilia@6
|
306 menubar.add_cascade(label="File", menu=menu_file) |
Ilia@6
|
307 |
Ilia@6
|
308 menu_action = Menu(menubar) |
Ilia@9
|
309 menu_action.add_command(label="Start", command=handlers.start) |
Ilia@9
|
310 menu_action.add_command(label="Stop", command=handlers.stop) |
Ilia@9
|
311 menu_action.add_command(label="Next Step", command=handlers.next_step) |
Ilia@12
|
312 menu_action.add_separator() |
Ilia@9
|
313 menu_action.add_command(label="Increase speed", command=handlers.faster) |
Ilia@9
|
314 menu_action.add_command(label="Decrease speed", command=handlers.slower) |
Ilia@12
|
315 menu_action.add_separator() |
Ilia@9
|
316 menu_action.add_command(label="Zoom In", command=handlers.zoom_in) |
Ilia@9
|
317 menu_action.add_command(label="Zoom Out", command=handlers.zoom_out) |
Ilia@12
|
318 menu_action.add_separator() |
Ilia@6
|
319 menu_action.add_command(label="Clean field") |
Ilia@6
|
320 menu_action.add_command(label="Fill randomly") |
Ilia@12
|
321 menu_action.add_command(label="Change size",command=handlers.show_size_window) |
Ilia@6
|
322 menubar.add_cascade(label="Action", menu=menu_action) |
Ilia@6
|
323 |
is_rusinov@7
|
324 menubar.add_command(label="Automata", command=handlers.automata_frame) |
Ilia@6
|
325 |
Ilia@12
|
326 menubar.add_command(label="Help", command=handlers.help) |
Ilia@6
|
327 |
Ilia@6
|
328 root.mainloop() |
Ilia@6
|
329
|