rev |
line source |
Ilia@6
|
1 from Tkinter import * |
Ilia@2
|
2 |
is_rusinov@18
|
3 from State import * |
is_rusinov@18
|
4 from Automata import * |
is_rusinov@18
|
5 |
is_rusinov@18
|
6 |
Ilia@2
|
7 class Handlers(object): |
is_rusinov@5
|
8 |
is_rusinov@54
|
9 def __init__(self, cell_size=8, line_width=1 ,delay=10, offset_x=0, offset_y=0):# cell_size is size of cell, including line width, if there is it |
is_rusinov@7
|
10 self.cell_size = cell_size |
is_rusinov@18
|
11 self.line_width = line_width |
is_rusinov@7
|
12 self.delay = delay |
Ilia@6
|
13 self.offset_x = offset_x |
Ilia@6
|
14 self.offset_y = offset_y |
is_rusinov@5
|
15 self.after_id = 0 |
is_rusinov@54
|
16 self.enter1_bound = False |
is_rusinov@54
|
17 self.enter3_bound = False |
is_rusinov@51
|
18 self.mouse_offset_x = 0 |
is_rusinov@51
|
19 self.mouse_offset_y = 0 |
is_rusinov@18
|
20 self.mouse_zoom = 0 |
is_rusinov@54
|
21 self.zoom_divisor = 1 |
is_rusinov@7
|
22 self.is_started = False |
is_rusinov@54
|
23 self.char = None |
is_rusinov@18
|
24 self.keys = dict() |
is_rusinov@29
|
25 self.draw() |
is_rusinov@5
|
26 def start(self): |
is_rusinov@8
|
27 if not self.is_started: |
is_rusinov@7
|
28 self.is_started = True |
is_rusinov@43
|
29 self.repeat() |
is_rusinov@43
|
30 def repeat(self): |
is_rusinov@43
|
31 self.next_step() |
is_rusinov@43
|
32 self.after_id = canvas.after(self.delay, self.repeat) |
is_rusinov@5
|
33 |
is_rusinov@5
|
34 def stop(self): |
is_rusinov@29
|
35 canvas.after_cancel(self.after_id) |
is_rusinov@7
|
36 self.is_started = False |
is_rusinov@5
|
37 |
is_rusinov@5
|
38 def next_step(self): |
is_rusinov@53
|
39 self.draw_cell(automata.next_step()) |
is_rusinov@5
|
40 |
is_rusinov@18
|
41 def save_file(self): |
Ilia@2
|
42 pass |
is_rusinov@5
|
43 |
is_rusinov@18
|
44 def open_file(self): |
Ilia@2
|
45 pass |
is_rusinov@5
|
46 |
is_rusinov@29
|
47 def show_help_window(self): |
Ilia@2
|
48 pass |
is_rusinov@5
|
49 |
is_rusinov@29
|
50 def hide_help_window(self): |
is_rusinov@8
|
51 pass |
is_rusinov@8
|
52 |
is_rusinov@8
|
53 def zoom_in(self, zoom_rate=1): |
is_rusinov@7
|
54 if self.cell_size < 50: |
is_rusinov@8
|
55 self.cell_size = self.cell_size + zoom_rate |
is_rusinov@7
|
56 self.draw() |
is_rusinov@5
|
57 |
is_rusinov@8
|
58 def zoom_out(self, zoom_rate=1): |
is_rusinov@7
|
59 if self.cell_size > 1: |
is_rusinov@8
|
60 self.cell_size = self.cell_size - zoom_rate |
is_rusinov@7
|
61 self.draw() |
is_rusinov@5
|
62 |
is_rusinov@8
|
63 def slower(self, speed_rate=1): |
is_rusinov@7
|
64 self.delay = self.delay + speed_rate |
is_rusinov@5
|
65 |
is_rusinov@8
|
66 def faster(self, speed_rate=1): |
is_rusinov@29
|
67 if self.delay > speed_rate: |
is_rusinov@7
|
68 self.delay = self.delay - speed_rate |
is_rusinov@7
|
69 else: |
is_rusinov@7
|
70 self.delay = 0 |
is_rusinov@5
|
71 |
is_rusinov@18
|
72 def change_size(self, dx, dy, position=0): |
is_rusinov@8
|
73 if position < 9: |
is_rusinov@8
|
74 if position == 0 or position == 3 or position == 6: |
is_rusinov@8
|
75 automata.change_size(dx, 3) |
is_rusinov@8
|
76 elif position == 1 or position == 4 or position == 7: |
is_rusinov@8
|
77 automata.change_size(dx / 2, 3) |
is_rusinov@8
|
78 automata.change_size(dx - dx / 2, 1) |
is_rusinov@18
|
79 else: |
is_rusinov@8
|
80 automata.change_size(dx, 1) |
is_rusinov@8
|
81 if position == 0 or position == 1 or position == 2: |
is_rusinov@8
|
82 automata.change_size(dy, 0) |
is_rusinov@8
|
83 elif position == 3 or position == 4 or position == 5: |
is_rusinov@8
|
84 automata.change_size(dy / 2, 0) |
is_rusinov@8
|
85 automata.change_size(dy - dy / 2, 2) |
is_rusinov@18
|
86 else: |
is_rusinov@8
|
87 automata.change_size(dy, 2) |
is_rusinov@8
|
88 self.draw() |
is_rusinov@5
|
89 |
darkhan@50
|
90 def draw_cell(self, cells): |
darkhan@50
|
91 for row, col in cells: |
darkhan@42
|
92 index = automata.symbols[automata.field[row][col]] |
darkhan@42
|
93 color = automata.states[index].color |
darkhan@42
|
94 canvas.itemconfig(self.cells[row][col], fill=color) |
darkhan@42
|
95 |
darkhan@32
|
96 def draw(self): |
darkhan@31
|
97 canvas.delete("all") |
darkhan@42
|
98 self.cells = [] |
darkhan@31
|
99 |
darkhan@31
|
100 shift = self.cell_size + self.line_width |
darkhan@42
|
101 |
darkhan@42
|
102 left = -self.offset_x + self.line_width |
darkhan@42
|
103 top = -self.offset_y + self.line_width |
darkhan@31
|
104 for row in range(automata.height): |
darkhan@42
|
105 self.cells.append([]) |
darkhan@31
|
106 for col in range(automata.width): |
darkhan@31
|
107 index = automata.symbols[automata.field[row][col]] |
darkhan@31
|
108 color = automata.states[index].color |
darkhan@42
|
109 cell = canvas.create_rectangle(left + col * shift, |
darkhan@31
|
110 top + row * shift, |
darkhan@31
|
111 left + col * shift + self.cell_size, |
darkhan@31
|
112 top + row * shift + self.cell_size, |
darkhan@50
|
113 fill=color, outline="", tag="cell") |
darkhan@42
|
114 self.cells[row].append(cell) |
is_rusinov@5
|
115 |
is_rusinov@7
|
116 def press1(self, event):# drawer |
is_rusinov@54
|
117 if self.enter1_bound: |
is_rusinov@54
|
118 canvas.tag_unbind("cell", "<Enter>") |
is_rusinov@54
|
119 self.enter1_bound = False |
is_rusinov@54
|
120 else: |
is_rusinov@54
|
121 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@54
|
122 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@54
|
123 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states) |
is_rusinov@54
|
124 if self.char != None and self.keys.has_key(self.char): |
is_rusinov@54
|
125 index = self.keys[self.char] |
is_rusinov@54
|
126 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@54
|
127 self.draw_cell([(row, column)]) |
is_rusinov@54
|
128 |
is_rusinov@54
|
129 def d_press1(self, event):# drawer |
is_rusinov@54
|
130 canvas.tag_bind("cell", "<Enter>", self.enter1) |
is_rusinov@54
|
131 self.enter1_bound = True |
is_rusinov@54
|
132 |
is_rusinov@54
|
133 def enter1(self, event): |
is_rusinov@26
|
134 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
135 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
136 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states) |
is_rusinov@54
|
137 if self.char != None and self.keys.has_key(self.char): |
is_rusinov@54
|
138 index = self.keys[self.char] |
is_rusinov@18
|
139 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@53
|
140 self.draw_cell([(row, column)]) |
is_rusinov@5
|
141 |
is_rusinov@7
|
142 def press3(self, event):# drawer |
is_rusinov@54
|
143 if self.enter3_bound: |
is_rusinov@54
|
144 canvas.tag_unbind("cell", "<Enter>") |
is_rusinov@54
|
145 self.enter3_bound = False |
is_rusinov@54
|
146 else: |
is_rusinov@54
|
147 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@54
|
148 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@54
|
149 index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states) |
is_rusinov@54
|
150 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@54
|
151 self.draw_cell([(row, column)]) |
is_rusinov@54
|
152 |
is_rusinov@54
|
153 def d_press3(self, event):# drawer |
is_rusinov@54
|
154 canvas.tag_bind("cell", "<Enter>", self.enter3) |
is_rusinov@54
|
155 self.enter3_bound = True |
is_rusinov@54
|
156 |
is_rusinov@54
|
157 def enter3(self, event): |
is_rusinov@26
|
158 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
159 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@54
|
160 index = (automata.symbols[automata.field[row][column]] - 1) % len(automata.states) |
is_rusinov@18
|
161 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@53
|
162 self.draw_cell([(row, column)]) |
is_rusinov@5
|
163 |
is_rusinov@54
|
164 def press_key(self, event):# drawer |
is_rusinov@54
|
165 self.char = event.char |
is_rusinov@5
|
166 |
is_rusinov@54
|
167 def release_key(self, event):# drawer |
is_rusinov@54
|
168 self.char = None |
is_rusinov@18
|
169 |
is_rusinov@43
|
170 def press1_ctrl(self, event):# change_offset (B1+ctrl) |
is_rusinov@54
|
171 canvas.focus_set() |
is_rusinov@51
|
172 self.mouse_offset_x = event.x |
is_rusinov@51
|
173 self.mouse_offset_y = event.y |
is_rusinov@18
|
174 |
is_rusinov@43
|
175 def motion1_ctrl(self, event):# change_offset (B1+ctrl) |
is_rusinov@51
|
176 self.offset_x = (event.x - self.mouse_offset_x) / (self.cell_size + self.line_width) |
is_rusinov@51
|
177 self.offset_y = (event.y - self.mouse_offset_y) / (self.cell_size + self.line_width) |
is_rusinov@51
|
178 self.mouse_offset_x = event.x |
is_rusinov@51
|
179 self.mouse_offset_y = event.y |
is_rusinov@18
|
180 self.draw() |
is_rusinov@5
|
181 |
is_rusinov@43
|
182 def press13(self, event):# zoom |
is_rusinov@54
|
183 canvas.focus_set() |
is_rusinov@18
|
184 self.mouse_zoom = event.y |
is_rusinov@5
|
185 |
is_rusinov@43
|
186 def motion13(self, event):# zoom |
is_rusinov@18
|
187 delta = (event.y - self.mouse_zoom) / self.zoom_divisor |
is_rusinov@18
|
188 self.cell_size = self.cell_size + delta |
is_rusinov@18
|
189 if self.cell_size > 50: |
is_rusinov@18
|
190 self.cell_size = 50 |
is_rusinov@18
|
191 if self.cell_size < 1: |
is_rusinov@18
|
192 self.cell_size = 1 |
is_rusinov@18
|
193 self.mouse_zoom = event.y |
is_rusinov@18
|
194 self.draw() |
is_rusinov@5
|
195 |
is_rusinov@8
|
196 def to_top(self):# replace choosen state to top |
is_rusinov@58
|
197 selected = state_list.curselection() |
is_rusinov@58
|
198 if len(selected): |
is_rusinov@58
|
199 index = int(selected[0]) |
is_rusinov@58
|
200 state = automata.states[index] |
is_rusinov@58
|
201 print state |
is_rusinov@58
|
202 del automata.states[index] |
is_rusinov@58
|
203 automata.states.insert(0, state) |
is_rusinov@58
|
204 self.refresh_list() |
is_rusinov@58
|
205 state_list.selection_set(0) |
is_rusinov@58
|
206 print automata.states |
is_rusinov@7
|
207 |
is_rusinov@8
|
208 def to_bottom(self):# replace choosen state to botton |
is_rusinov@58
|
209 selected = state_list.curselection() |
is_rusinov@58
|
210 if len(selected): |
is_rusinov@58
|
211 index = int(selected[0]) |
is_rusinov@58
|
212 state = automata.states[index] |
is_rusinov@58
|
213 print state |
is_rusinov@58
|
214 del automata.states[index] |
is_rusinov@58
|
215 automata.states.append(state) |
is_rusinov@58
|
216 self.refresh_list() |
is_rusinov@58
|
217 state_list.selection_set("end") |
is_rusinov@58
|
218 print automata.states |
is_rusinov@7
|
219 |
is_rusinov@8
|
220 def upwards(self): |
is_rusinov@58
|
221 selected = state_list.curselection() |
is_rusinov@58
|
222 if len(selected): |
is_rusinov@58
|
223 index = int(selected[0]) |
is_rusinov@58
|
224 if index > 0: |
is_rusinov@58
|
225 state = automata.states[index] |
is_rusinov@58
|
226 print state |
is_rusinov@58
|
227 del automata.states[index] |
is_rusinov@58
|
228 automata.states.insert(index - 1, state) |
is_rusinov@58
|
229 self.refresh_list() |
is_rusinov@58
|
230 state_list.selection_set(index - 1) |
is_rusinov@58
|
231 print automata.states |
is_rusinov@7
|
232 |
is_rusinov@8
|
233 def downwards(self): |
is_rusinov@58
|
234 selected = state_list.curselection() |
is_rusinov@58
|
235 if len(selected): |
is_rusinov@58
|
236 index = int(selected[0]) |
is_rusinov@58
|
237 if index < state_list.size() - 1: |
is_rusinov@58
|
238 state = automata.states[index] |
is_rusinov@58
|
239 print state |
is_rusinov@58
|
240 del automata.states[index] |
is_rusinov@58
|
241 automata.states.insert(index + 1, state) |
is_rusinov@58
|
242 self.refresh_list() |
is_rusinov@58
|
243 state_list.selection_set(index + 1) |
is_rusinov@58
|
244 print automata.states |
is_rusinov@7
|
245 |
is_rusinov@8
|
246 def delete_state(self):# delete choosen state |
is_rusinov@58
|
247 selected = state_list.curselection() |
is_rusinov@58
|
248 if len(selected): |
is_rusinov@58
|
249 index = int(selected[0]) |
is_rusinov@58
|
250 print automata.states[index] |
is_rusinov@58
|
251 del automata.symbols[automata.states[index].symbol] |
is_rusinov@58
|
252 for key in self.keys.keys(): |
is_rusinov@58
|
253 if self.keys[key] == index: |
is_rusinov@58
|
254 del self.keys[key] |
is_rusinov@58
|
255 del automata.states[index] |
is_rusinov@58
|
256 self.refresh_list() |
is_rusinov@58
|
257 print automata.states |
is_rusinov@7
|
258 |
is_rusinov@18
|
259 def add(self):# add new state |
is_rusinov@29
|
260 name = state_name.get() |
is_rusinov@48
|
261 symbol = state_symbol.get() |
is_rusinov@54
|
262 key = state_key.get().lower() |
is_rusinov@29
|
263 color = state_color.get() |
is_rusinov@29
|
264 nums = [] |
is_rusinov@29
|
265 for i, value in enumerate(ckeckbox_nums): |
is_rusinov@29
|
266 if value: |
is_rusinov@29
|
267 nums.append(i) |
is_rusinov@54
|
268 if self.keys.has_key(key): |
is_rusinov@29
|
269 error.config(text="State with such key has already existed") |
is_rusinov@29
|
270 state_key.focus() |
is_rusinov@29
|
271 elif len(key) != 1: |
is_rusinov@29
|
272 error.config(text="Bad key for state") |
is_rusinov@29
|
273 state_key.focus() |
is_rusinov@29
|
274 elif automata.symbols.has_key(symbol): |
is_rusinov@29
|
275 error.config(text="State with such symbol has already existed") |
is_rusinov@29
|
276 state_symbol.focus() |
is_rusinov@29
|
277 elif len(symbol) != 1: |
is_rusinov@29
|
278 error.config(text="Bad symbol for state") |
is_rusinov@29
|
279 state_symbol.focus() |
is_rusinov@29
|
280 else: |
is_rusinov@29
|
281 state = State(name, symbol, color, nums) |
is_rusinov@29
|
282 automata.states.append(state) |
is_rusinov@34
|
283 automata.symbols[symbol] = len(automata.states) - 1 |
is_rusinov@34
|
284 self.keys[key] = len(automata.states) - 1 |
is_rusinov@58
|
285 error.config(text="") |
is_rusinov@58
|
286 self.refresh_list() |
is_rusinov@5
|
287 |
is_rusinov@18
|
288 def change(self):# change chosen state |
is_rusinov@58
|
289 selected = state_list.curselection() |
is_rusinov@58
|
290 if len(selected): |
is_rusinov@58
|
291 index = int(selected[0]) |
is_rusinov@58
|
292 name = state_name.get() |
is_rusinov@58
|
293 symbol = state_symbol.get() |
is_rusinov@58
|
294 key = state_key.get().lower() |
is_rusinov@58
|
295 color = state_color.get() |
is_rusinov@58
|
296 nums = [] |
is_rusinov@58
|
297 for i, value in enumerate(ckeckbox_nums): |
is_rusinov@58
|
298 print i, value.get() |
is_rusinov@58
|
299 if value.get() == 1: |
is_rusinov@58
|
300 nums.append(i) |
is_rusinov@58
|
301 print nums |
is_rusinov@58
|
302 if self.keys.has_key(key) and self.keys[key] != index: |
is_rusinov@58
|
303 error.config(text="State with such key has already existed") |
is_rusinov@58
|
304 state_key.focus() |
is_rusinov@58
|
305 elif len(key) != 1: |
is_rusinov@58
|
306 error.config(text="Bad key for state") |
is_rusinov@58
|
307 state_key.focus() |
is_rusinov@58
|
308 elif automata.symbols.has_key(symbol) and automata.symbols[symbol] != index: |
is_rusinov@58
|
309 error.config(text="State with such symbol has already existed") |
is_rusinov@58
|
310 state_symbol.focus() |
is_rusinov@58
|
311 elif len(symbol) != 1: |
is_rusinov@58
|
312 error.config(text="Bad symbol for state") |
is_rusinov@58
|
313 state_symbol.focus() |
is_rusinov@58
|
314 else: |
is_rusinov@58
|
315 state = State(name, symbol, color, nums) |
is_rusinov@58
|
316 automata.states[index] = state |
is_rusinov@58
|
317 automata.symbols[symbol] = index |
is_rusinov@58
|
318 self.keys[key] = index |
is_rusinov@58
|
319 error.config(text="") |
is_rusinov@58
|
320 self.refresh_list() |
is_rusinov@54
|
321 |
is_rusinov@18
|
322 def show_size_window(self): |
is_rusinov@18
|
323 size_window.deiconify() |
Ilia@55
|
324 |
is_rusinov@18
|
325 def hide_size_window(self): |
is_rusinov@18
|
326 size_window.withdraw() |
Ilia@55
|
327 |
Ilia@55
|
328 def show_automata_window(self): |
Ilia@55
|
329 automata_window.deiconify() |
Ilia@55
|
330 |
Ilia@55
|
331 def hide_automata_window(self): |
Ilia@55
|
332 automata_window.withdraw() |
is_rusinov@58
|
333 def refresh_list(self): |
is_rusinov@58
|
334 state_list.delete(0, "end") |
is_rusinov@58
|
335 for state in automata.states: |
is_rusinov@58
|
336 state_list.insert("end", state) |
is_rusinov@58
|
337 def list_mouse_release(self, event): |
is_rusinov@58
|
338 print 'hello' |
is_rusinov@58
|
339 selected = state_list.curselection() |
is_rusinov@58
|
340 if len(selected): |
is_rusinov@58
|
341 index = int(selected[0]) |
is_rusinov@58
|
342 state = automata.states[index] |
is_rusinov@58
|
343 state_name.delete(0, "end") |
is_rusinov@58
|
344 state_name.insert(0, state.name) |
is_rusinov@58
|
345 state_symbol.delete(0, "end") |
is_rusinov@58
|
346 state_symbol.insert(0, state.symbol) |
is_rusinov@58
|
347 for key in self.keys.keys(): |
is_rusinov@58
|
348 if self.keys[key] == index: |
is_rusinov@58
|
349 state_key.delete(0, "end") |
is_rusinov@58
|
350 state_key.insert(0, key) |
is_rusinov@58
|
351 state_color.delete(0, "end") |
is_rusinov@58
|
352 state_color.insert(0, state.color) |
is_rusinov@58
|
353 for i in range(9): |
is_rusinov@58
|
354 ckeckbox_nums[i].set(i in state.nums) |
Ilia@55
|
355 |
Ilia@6
|
356 |
Ilia@6
|
357 |
Ilia@6
|
358 root = Tk() |
Ilia@36
|
359 root.title("Cyclic Cellular Automata") |
Ilia@6
|
360 |
darkhan@42
|
361 canvas = Canvas(root, background="grey") |
Ilia@6
|
362 canvas.config(width=500, height=400) |
Ilia@6
|
363 |
is_rusinov@54
|
364 automata = Automata() |
Ilia@36
|
365 handlers = Handlers() |
Ilia@36
|
366 |
is_rusinov@54
|
367 canvas.tag_bind("cell", "<1>", handlers.press1) |
is_rusinov@54
|
368 canvas.tag_bind("cell", "<Double-Button-1>", handlers.d_press1) |
is_rusinov@54
|
369 canvas.tag_bind("cell", "<3>", handlers.press3) |
is_rusinov@54
|
370 canvas.tag_bind("cell", "<Double-Button-3>", handlers.d_press3) |
is_rusinov@54
|
371 canvas.bind_all("<KeyPress>", handlers.press_key) |
is_rusinov@54
|
372 canvas.bind_all("<KeyRelease>", handlers.release_key) |
is_rusinov@54
|
373 #canvas.bind("<Control-ButtonPress-1>", handlers.press1_ctrl) |
is_rusinov@54
|
374 #canvas.bind("<Control-B1-Motion>", handlers.motion1_ctrl) |
is_rusinov@54
|
375 #canvas.bind("<Shift-ButtonPress-1>", handlers.press13) |
is_rusinov@54
|
376 #canvas.bind("<Shift-ButtonPress-1>", handlers.motion13) |
Ilia@36
|
377 |
Ilia@36
|
378 canvas.pack(fill="both", expand="yes") |
Ilia@6
|
379 |
Ilia@6
|
380 #infoPanel=Frame |
Ilia@55
|
381 automata_window = Toplevel(root) |
Ilia@55
|
382 automata_window.title("Automata") |
Ilia@55
|
383 automata_window.withdraw() |
Ilia@55
|
384 automata_window.resizable(False, False) |
Ilia@55
|
385 automata_window.protocol("WM_DELETE_WINDOW", handlers.hide_automata_window) |
Ilia@9
|
386 |
Ilia@55
|
387 headline = Label(automata_window, text= "Automata Panel", font=16) |
Ilia@55
|
388 headline.pack(side="top",fill="both", expand="no") |
Ilia@9
|
389 |
Ilia@55
|
390 Label(automata_window, text= "State Box:").pack(side="top", fill="x") |
Ilia@56
|
391 |
Ilia@56
|
392 list_frame=Frame(automata_window) |
Ilia@56
|
393 scrollbar = Scrollbar(list_frame) |
Ilia@57
|
394 scrollbar.pack(side="right", fill="y") |
is_rusinov@58
|
395 state_list=Listbox(list_frame, yscrollcommand=scrollbar.set, activestyle="none", selectmode="single") |
is_rusinov@58
|
396 handlers.refresh_list() |
is_rusinov@58
|
397 state_list.bind("<ButtonRelease-1>", handlers.list_mouse_release) |
is_rusinov@7
|
398 state_list.pack(side="top", fill="y") |
Ilia@56
|
399 scrollbar.config(command=state_list.yview) |
Ilia@56
|
400 list_frame.pack(side="top") |
Ilia@56
|
401 |
Ilia@55
|
402 up = Button(automata_window, text="Up", command=handlers.upwards) |
Ilia@6
|
403 up.config(bg="red") |
Ilia@55
|
404 down = Button(automata_window, text="Down", command=handlers.downwards) |
Ilia@6
|
405 down.config(bg="orange") |
Ilia@55
|
406 to_top = Button(automata_window, text="To Top", command=handlers.to_top) |
Ilia@6
|
407 to_top.config(bg="yellow") |
Ilia@55
|
408 to_bottom = Button(automata_window, text="To Bottom", command=handlers.to_bottom) |
Ilia@6
|
409 to_bottom.config(bg="green") |
Ilia@55
|
410 delete = Button(automata_window, text="Delete", command=handlers.delete_state) |
Ilia@9
|
411 delete.config(bg="cyan") |
Ilia@6
|
412 up.pack(side="top", fill="x") |
Ilia@6
|
413 down.pack(side="top", fill="x") |
Ilia@6
|
414 to_top.pack(side="top", fill="x") |
Ilia@6
|
415 to_bottom.pack(side="top", fill="x") |
Ilia@9
|
416 delete.pack(side="top", fill="x") |
Ilia@6
|
417 |
Ilia@6
|
418 |
Ilia@55
|
419 information = Label(automata_window, text= "Information of State") |
Ilia@9
|
420 information.pack(side="top", fill="x") |
Ilia@55
|
421 info_frame=Frame(automata_window) |
Ilia@9
|
422 Label(info_frame, text="Name").grid(row=0, column=0) |
Ilia@9
|
423 state_name = Entry(info_frame) |
Ilia@9
|
424 state_name.grid(row=0, column=1) |
Ilia@9
|
425 Label(info_frame, text="Symbol").grid(row=1, column=0) |
Ilia@9
|
426 state_symbol = Entry(info_frame) |
Ilia@9
|
427 state_symbol.grid(row=1, column=1) |
Ilia@9
|
428 Label(info_frame, text="Color").grid(row=2, column=0) |
Ilia@9
|
429 state_color = Entry(info_frame) |
Ilia@9
|
430 state_color.grid(row=2, column=1) |
Ilia@9
|
431 Label(info_frame, text="Key").grid(row=3, column=0) |
Ilia@9
|
432 state_key = Entry(info_frame) |
Ilia@9
|
433 state_key.grid(row=3, column=1) |
Ilia@9
|
434 info_frame.pack(side="top") |
Ilia@9
|
435 |
Ilia@9
|
436 |
Ilia@36
|
437 ckeckbox_nums = [IntVar(), IntVar(), IntVar(), IntVar(), IntVar(), |
Ilia@36
|
438 IntVar(), IntVar(), IntVar(), IntVar()] |
Ilia@33
|
439 |
Ilia@55
|
440 condition = Label(automata_window, text= "Condition of conversion") |
Ilia@9
|
441 condition.pack(side="top", fill="x") |
Ilia@55
|
442 condition_frame=Frame(automata_window) |
Ilia@9
|
443 Label(condition_frame, text="0: ").grid(row=0, column=0) |
Ilia@39
|
444 c_button_0 = Checkbutton(condition_frame, variable=ckeckbox_nums[0]) |
Ilia@36
|
445 c_button_0.grid(row=0, column=1) |
Ilia@9
|
446 Label(condition_frame, text="1: ").grid(row=0, column=2) |
Ilia@39
|
447 c_button_1 = Checkbutton(condition_frame, variable=ckeckbox_nums[1]) |
Ilia@36
|
448 c_button_1.grid(row=0, column=3) |
Ilia@9
|
449 Label(condition_frame, text="2: ").grid(row=0, column=4) |
Ilia@39
|
450 c_button_2 = Checkbutton(condition_frame, variable=ckeckbox_nums[2]) |
Ilia@36
|
451 c_button_2.grid(row=0, column=5) |
Ilia@9
|
452 Label(condition_frame, text="3: ").grid(row=1, column=0) |
Ilia@39
|
453 c_button_3 = Checkbutton(condition_frame, variable=ckeckbox_nums[3]) |
Ilia@36
|
454 c_button_3.grid(row=1, column=1) |
Ilia@9
|
455 Label(condition_frame, text="4: ").grid(row=1, column=2) |
Ilia@39
|
456 c_button_4 = Checkbutton(condition_frame, variable=ckeckbox_nums[4]) |
Ilia@36
|
457 c_button_4.grid(row=1, column=3) |
Ilia@9
|
458 Label(condition_frame, text="5: ").grid(row=1, column=4) |
Ilia@39
|
459 c_button_5 = Checkbutton(condition_frame, variable=ckeckbox_nums[5]) |
Ilia@36
|
460 c_button_5.grid(row=1, column=5) |
Ilia@9
|
461 Label(condition_frame, text="6: ").grid(row=2, column=0) |
Ilia@39
|
462 c_button_6 = Checkbutton(condition_frame, variable=ckeckbox_nums[6]) |
Ilia@36
|
463 c_button_6.grid(row=2, column=1) |
Ilia@9
|
464 Label(condition_frame, text="7: ").grid(row=2, column=2) |
Ilia@39
|
465 c_button_7 = Checkbutton(condition_frame, variable=ckeckbox_nums[7]) |
Ilia@36
|
466 c_button_7.grid(row=2, column=3) |
Ilia@9
|
467 Label(condition_frame, text="8: ").grid(row=2, column=4) |
Ilia@39
|
468 c_button_8 = Checkbutton(condition_frame, variable=ckeckbox_nums[8]) |
Ilia@36
|
469 c_button_8.grid(row=2, column=5) |
Ilia@9
|
470 condition_frame.pack(side="top") |
Ilia@9
|
471 |
Ilia@9
|
472 |
Ilia@55
|
473 add_state = Button(automata_window, text="Add", command=handlers.add) |
Ilia@9
|
474 add_state.config(bg="blue") |
Ilia@55
|
475 change_state = Button(automata_window, text="Change", command=handlers.change) |
Ilia@9
|
476 change_state.config(bg="violet") |
Ilia@9
|
477 add_state.pack(side="top", fill="x") |
Ilia@9
|
478 change_state.pack(side="top", fill="x") |
Ilia@9
|
479 |
Ilia@55
|
480 error=Label(automata_window) |
Ilia@9
|
481 error.pack(side="top", fill="x") |
is_rusinov@8
|
482 |
is_rusinov@8
|
483 |
Ilia@12
|
484 side = 0 |
Ilia@12
|
485 |
Ilia@12
|
486 size_window = Toplevel(root) |
Ilia@12
|
487 size_window.title("") |
Ilia@13
|
488 size_window.withdraw() |
Ilia@55
|
489 size_window.resizable(False, False) |
Ilia@12
|
490 size_window.protocol("WM_DELETE_WINDOW", handlers.hide_size_window) |
Ilia@12
|
491 Label(size_window, text= "Current size of window:").pack(side="top", fill="x") |
Ilia@19
|
492 size = Label(size_window, text= str(len(automata.field)) + " x " + str(len(automata.field[0]))) |
Ilia@19
|
493 size.pack(side="top", fill="x") |
Ilia@12
|
494 Label(size_window, text= "New size:").pack(side="top", fill="x") |
Ilia@12
|
495 new_size = Frame(size_window) |
Ilia@12
|
496 size_x = Entry(new_size, width=5) |
Ilia@12
|
497 size_x.grid(row=0, column=0) |
Ilia@12
|
498 Label(new_size, text=" x ").grid(row=0, column=1) |
Ilia@12
|
499 size_y = Entry(new_size, width=5) |
Ilia@12
|
500 size_y.grid(row=0, column=2) |
Ilia@12
|
501 new_size.pack(side="top") |
Ilia@12
|
502 Label(size_window, text= "Expansion of window:").pack(side="top", fill="x") |
Ilia@12
|
503 expansion = Frame(size_window) |
Ilia@12
|
504 r0 = Radiobutton(expansion, variable=side, value = 0, indicatoron=0, width=2, height=1) |
Ilia@12
|
505 r0.select() |
Ilia@12
|
506 r0.grid(row=0, column=0) |
Ilia@12
|
507 r1 = Radiobutton(expansion, variable=side, value = 1, indicatoron=0, width=2, height=1) |
Ilia@12
|
508 r1.grid(row=0, column=1) |
Ilia@12
|
509 r2 = Radiobutton(expansion, variable=side, value = 2, indicatoron=0, width=2, height=1) |
Ilia@12
|
510 r2.grid(row=0, column=2) |
Ilia@12
|
511 r3 = Radiobutton(expansion, variable=side, value = 3, indicatoron=0, width=2, height=1) |
Ilia@12
|
512 r3.grid(row=1, column=0) |
Ilia@12
|
513 r4 = Radiobutton(expansion, variable=side, value = 4, indicatoron=0, width=2, height=1) |
Ilia@12
|
514 r4.grid(row=1, column=1) |
Ilia@12
|
515 r5 = Radiobutton(expansion, variable=side, value = 5, indicatoron=0, width=2, height=1) |
Ilia@12
|
516 r5.grid(row=1, column=2) |
Ilia@12
|
517 r6 = Radiobutton(expansion, variable=side, value = 6, indicatoron=0, width=2, height=1) |
Ilia@12
|
518 r6.grid(row=2, column=0) |
Ilia@12
|
519 r7 = Radiobutton(expansion, variable=side, value = 7, indicatoron=0, width=2, height=1) |
Ilia@12
|
520 r7.grid(row=2, column=1) |
Ilia@12
|
521 r8 = Radiobutton(expansion, variable=side, value = 8, indicatoron=0, width=2, height=1) |
Ilia@12
|
522 r8.grid(row=2, column=2) |
Ilia@12
|
523 expansion.pack(side="top") |
Ilia@12
|
524 Label(size_window).pack(side="top", fill="x") |
Ilia@12
|
525 apply_frame = Frame(size_window, padx=10, pady=5) |
Ilia@12
|
526 apply_size = Button(apply_frame, text="Apply") |
Ilia@12
|
527 apply_size.config(bg="yellow") |
Ilia@12
|
528 apply_size.pack(side="left", fill="x") |
Ilia@12
|
529 close_size = Button(apply_frame, text="Close", command=handlers.hide_size_window) |
Ilia@12
|
530 close_size.config(bg="green") |
Ilia@12
|
531 close_size.pack(side="right", fill="x") |
Ilia@12
|
532 apply_frame.pack(side="top", fill="x") |
Ilia@12
|
533 |
Ilia@6
|
534 menubar = Menu(root) |
Ilia@6
|
535 root.config(menu=menubar) |
Ilia@6
|
536 |
Ilia@6
|
537 menu_file = Menu(menubar) |
Ilia@6
|
538 menu_file.add_command(label="New") |
Ilia@9
|
539 menu_file.add_command(label="Open...", command=handlers.open_file) |
Ilia@9
|
540 menu_file.add_command(label="Save...", command=handlers.save_file) |
Ilia@6
|
541 menu_file.add_separator() |
Ilia@9
|
542 menu_file.add_command(label="Exit", command=root.destroy) |
Ilia@6
|
543 menubar.add_cascade(label="File", menu=menu_file) |
Ilia@6
|
544 |
Ilia@6
|
545 menu_action = Menu(menubar) |
Ilia@9
|
546 menu_action.add_command(label="Start", command=handlers.start) |
Ilia@9
|
547 menu_action.add_command(label="Stop", command=handlers.stop) |
Ilia@9
|
548 menu_action.add_command(label="Next Step", command=handlers.next_step) |
Ilia@12
|
549 menu_action.add_separator() |
Ilia@9
|
550 menu_action.add_command(label="Increase speed", command=handlers.faster) |
Ilia@9
|
551 menu_action.add_command(label="Decrease speed", command=handlers.slower) |
Ilia@12
|
552 menu_action.add_separator() |
Ilia@9
|
553 menu_action.add_command(label="Zoom In", command=handlers.zoom_in) |
Ilia@9
|
554 menu_action.add_command(label="Zoom Out", command=handlers.zoom_out) |
Ilia@12
|
555 menu_action.add_separator() |
Ilia@6
|
556 menu_action.add_command(label="Clean field") |
Ilia@6
|
557 menu_action.add_command(label="Fill randomly") |
Ilia@13
|
558 menu_action.add_separator() |
Ilia@12
|
559 menu_action.add_command(label="Change size",command=handlers.show_size_window) |
Ilia@6
|
560 menubar.add_cascade(label="Action", menu=menu_action) |
Ilia@6
|
561 |
Ilia@55
|
562 menubar.add_command(label="Automata", command=handlers.show_automata_window) |
Ilia@6
|
563 |
is_rusinov@43
|
564 menubar.add_command(label="Help", command=handlers.show_help_window) |
Ilia@6
|
565 |
Ilia@6
|
566 root.mainloop() |
Ilia@6
|
567
|