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@18
|
9 def __init__(self, cell_size=5, 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@18
|
16 self.mouse_x = 0 |
is_rusinov@18
|
17 self.mouse_y = 0 |
is_rusinov@18
|
18 self.mouse_zoom = 0 |
is_rusinov@18
|
19 self.zoom_divisor = 10 |
is_rusinov@7
|
20 self.is_started = False |
is_rusinov@18
|
21 self.keys = dict() |
is_rusinov@29
|
22 self.draw() |
is_rusinov@5
|
23 def start(self): |
is_rusinov@8
|
24 if not self.is_started: |
is_rusinov@7
|
25 self.is_started = True |
is_rusinov@7
|
26 self.next_step() |
is_rusinov@7
|
27 self.after_id = canvas.after(self.delay, self.start) |
is_rusinov@5
|
28 |
is_rusinov@5
|
29 def stop(self): |
is_rusinov@29
|
30 canvas.after_cancel(self.after_id) |
is_rusinov@7
|
31 self.is_started = False |
is_rusinov@5
|
32 |
is_rusinov@5
|
33 def next_step(self): |
is_rusinov@7
|
34 automata.next_step() |
is_rusinov@5
|
35 self.draw() |
is_rusinov@5
|
36 |
is_rusinov@18
|
37 def save_file(self): |
Ilia@2
|
38 pass |
is_rusinov@5
|
39 |
is_rusinov@18
|
40 def open_file(self): |
Ilia@2
|
41 pass |
is_rusinov@5
|
42 |
is_rusinov@29
|
43 def show_help_window(self): |
Ilia@2
|
44 pass |
is_rusinov@5
|
45 |
is_rusinov@29
|
46 def hide_help_window(self): |
is_rusinov@8
|
47 pass |
is_rusinov@8
|
48 |
is_rusinov@8
|
49 def zoom_in(self, zoom_rate=1): |
is_rusinov@7
|
50 if self.cell_size < 50: |
is_rusinov@8
|
51 self.cell_size = self.cell_size + zoom_rate |
is_rusinov@7
|
52 self.draw() |
is_rusinov@5
|
53 |
is_rusinov@8
|
54 def zoom_out(self, zoom_rate=1): |
is_rusinov@7
|
55 if self.cell_size > 1: |
is_rusinov@8
|
56 self.cell_size = self.cell_size - zoom_rate |
is_rusinov@7
|
57 self.draw() |
is_rusinov@5
|
58 |
is_rusinov@8
|
59 def slower(self, speed_rate=1): |
is_rusinov@7
|
60 self.delay = self.delay + speed_rate |
is_rusinov@5
|
61 |
is_rusinov@8
|
62 def faster(self, speed_rate=1): |
is_rusinov@29
|
63 if self.delay > speed_rate: |
is_rusinov@7
|
64 self.delay = self.delay - speed_rate |
is_rusinov@7
|
65 else: |
is_rusinov@7
|
66 self.delay = 0 |
is_rusinov@5
|
67 |
is_rusinov@18
|
68 def change_size(self, dx, dy, position=0): |
is_rusinov@8
|
69 if position < 9: |
is_rusinov@8
|
70 if position == 0 or position == 3 or position == 6: |
is_rusinov@8
|
71 automata.change_size(dx, 3) |
is_rusinov@8
|
72 elif position == 1 or position == 4 or position == 7: |
is_rusinov@8
|
73 automata.change_size(dx / 2, 3) |
is_rusinov@8
|
74 automata.change_size(dx - dx / 2, 1) |
is_rusinov@18
|
75 else: |
is_rusinov@8
|
76 automata.change_size(dx, 1) |
is_rusinov@8
|
77 if position == 0 or position == 1 or position == 2: |
is_rusinov@8
|
78 automata.change_size(dy, 0) |
is_rusinov@8
|
79 elif position == 3 or position == 4 or position == 5: |
is_rusinov@8
|
80 automata.change_size(dy / 2, 0) |
is_rusinov@8
|
81 automata.change_size(dy - dy / 2, 2) |
is_rusinov@18
|
82 else: |
is_rusinov@8
|
83 automata.change_size(dy, 2) |
is_rusinov@8
|
84 self.draw() |
is_rusinov@5
|
85 |
darkhan@32
|
86 def draw(self): |
darkhan@31
|
87 canvas.delete("all") |
darkhan@31
|
88 |
darkhan@31
|
89 shift = self.cell_size + self.line_width |
darkhan@31
|
90 left = -self.offset_x |
darkhan@31
|
91 top = -self.offset_x |
darkhan@31
|
92 for row in range(automata.height + 1): |
darkhan@31
|
93 canvas.create_rectangle(left, |
darkhan@31
|
94 top + row * shift, |
darkhan@31
|
95 left + (automata.width) * shift + 1, |
darkhan@31
|
96 top + row * shift + self.line_width, |
darkhan@31
|
97 fill="grey", outline="") |
darkhan@31
|
98 for col in range(automata.width + 1): |
darkhan@31
|
99 canvas.create_rectangle(left + col * shift, |
darkhan@31
|
100 top, |
darkhan@31
|
101 left + col * shift + self.line_width, |
darkhan@31
|
102 top + (automata.height) * shift + 1, |
darkhan@31
|
103 fill="grey", outline="") |
darkhan@31
|
104 left += self.line_width |
darkhan@31
|
105 top += self.line_width |
darkhan@31
|
106 for row in range(automata.height): |
darkhan@31
|
107 for col in range(automata.width): |
darkhan@31
|
108 index = automata.symbols[automata.field[row][col]] |
darkhan@31
|
109 color = automata.states[index].color |
darkhan@31
|
110 canvas.create_rectangle(left + col * shift, |
darkhan@31
|
111 top + row * shift, |
darkhan@31
|
112 left + col * shift + self.cell_size, |
darkhan@31
|
113 top + row * shift + self.cell_size, |
darkhan@31
|
114 fill=color, outline="") |
is_rusinov@5
|
115 |
is_rusinov@7
|
116 def press1(self, event):# drawer |
is_rusinov@26
|
117 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
118 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
119 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states) |
is_rusinov@18
|
120 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@18
|
121 self.draw() |
is_rusinov@5
|
122 |
is_rusinov@7
|
123 def motion1(self, event):# drawer |
is_rusinov@26
|
124 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
125 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
126 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states) |
is_rusinov@18
|
127 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@18
|
128 self.draw() |
is_rusinov@5
|
129 |
is_rusinov@7
|
130 def press3(self, event):# drawer |
is_rusinov@26
|
131 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
132 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
133 index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states) |
is_rusinov@18
|
134 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@18
|
135 self.draw() |
is_rusinov@5
|
136 |
is_rusinov@7
|
137 def motion3(self, event):# drawer |
is_rusinov@26
|
138 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
139 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
140 index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states) |
is_rusinov@18
|
141 automata.field[row][column] = automata.states[index].symbol |
is_rusinov@18
|
142 self.draw() |
is_rusinov@5
|
143 |
is_rusinov@18
|
144 def press1_key(self, event):# drawer |
is_rusinov@18
|
145 if keys.has_key(event.char): |
is_rusinov@26
|
146 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
147 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
148 automata.field[row][column] = automata.states[keys[event.char]].symbol |
is_rusinov@18
|
149 self.draw() |
is_rusinov@5
|
150 |
is_rusinov@18
|
151 def motion1_key(self, event):# drawer |
is_rusinov@18
|
152 if keys.has_key(event.char): |
is_rusinov@26
|
153 column = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@26
|
154 row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width) |
is_rusinov@18
|
155 automata.field[row][column] = automata.states[keys[event.char]].symbol |
is_rusinov@18
|
156 self.draw() |
is_rusinov@18
|
157 |
is_rusinov@18
|
158 def press1_ctrl(self, event):# change_scale (B1+ctrl) |
is_rusinov@18
|
159 self.mouse_x = event.x |
is_rusinov@18
|
160 self.mouse_y = event.y |
is_rusinov@18
|
161 |
is_rusinov@18
|
162 def motion1_ctrl(self, event):# change_scale (B1+ctrl) |
is_rusinov@26
|
163 self.offset_x = (event.x - self.mouse_x) / (self.cell_size + self.line_width) |
is_rusinov@26
|
164 self.offset_y = (event.y - self.mouse_y) / (self.cell_size + self.line_width) |
is_rusinov@18
|
165 self.mouse_x = event.x |
is_rusinov@18
|
166 self.mouse_y = event.y |
is_rusinov@18
|
167 self.draw() |
is_rusinov@5
|
168 |
is_rusinov@7
|
169 def press12(self, event):# zoom |
is_rusinov@18
|
170 self.mouse_zoom = event.y |
is_rusinov@5
|
171 |
is_rusinov@7
|
172 def motion12(self, event):# zoom |
is_rusinov@18
|
173 delta = (event.y - self.mouse_zoom) / self.zoom_divisor |
is_rusinov@18
|
174 self.cell_size = self.cell_size + delta |
is_rusinov@18
|
175 if self.cell_size > 50: |
is_rusinov@18
|
176 self.cell_size = 50 |
is_rusinov@18
|
177 if self.cell_size < 1: |
is_rusinov@18
|
178 self.cell_size = 1 |
is_rusinov@18
|
179 self.mouse_zoom = event.y |
is_rusinov@18
|
180 self.draw() |
is_rusinov@5
|
181 |
is_rusinov@8
|
182 def automata_frame(self):# show automata_frame |
Ilia@9
|
183 automata_frame.pack(side="right", fill="y", expand="no", before=canvas) |
is_rusinov@7
|
184 |
is_rusinov@8
|
185 def to_top(self):# replace choosen state to top |
is_rusinov@29
|
186 index = automata.symbols.get(state_list.get("active").split()[1]) |
is_rusinov@29
|
187 state = automata.states[index] |
is_rusinov@29
|
188 del automata.states[index] |
is_rusinov@29
|
189 automata.states.insert(0, state) |
is_rusinov@7
|
190 |
is_rusinov@8
|
191 def to_bottom(self):# replace choosen state to botton |
is_rusinov@29
|
192 index = automata.symbols.get(state_list.get("active").split()[1]) |
is_rusinov@29
|
193 state = automata.states[index] |
is_rusinov@29
|
194 del automata.states[index] |
is_rusinov@29
|
195 automata.states.append(state) |
is_rusinov@7
|
196 |
is_rusinov@8
|
197 def upwards(self): |
is_rusinov@29
|
198 index = automata.symbols.get(state_list.get("active").split()[1]) |
is_rusinov@29
|
199 state = automata.states[index] |
is_rusinov@29
|
200 del automata.states[index] |
is_rusinov@29
|
201 automata.states.insert(index - 1, state) |
is_rusinov@7
|
202 |
is_rusinov@8
|
203 def downwards(self): |
is_rusinov@29
|
204 index = automata.symbols.get(state_list.get("active").split()[1]) |
is_rusinov@29
|
205 state = automata.states[index] |
is_rusinov@29
|
206 del automata.states[index] |
is_rusinov@29
|
207 automata.states.insert(index + 1, state) |
is_rusinov@7
|
208 |
is_rusinov@8
|
209 def delete_state(self):# delete choosen state |
is_rusinov@29
|
210 index = automata.symbols.get(state_list.get("active").split()[1]) |
is_rusinov@29
|
211 del automata.states[index] |
is_rusinov@7
|
212 |
is_rusinov@18
|
213 def add(self):# add new state |
Ilia@2
|
214 pass |
is_rusinov@29
|
215 name = state_name.get() |
is_rusinov@29
|
216 symbol = state_sympob.get() |
is_rusinov@29
|
217 key = lower(state_key.get()) |
is_rusinov@29
|
218 color = state_color.get() |
is_rusinov@29
|
219 nums = [] |
is_rusinov@29
|
220 for i, value in enumerate(ckeckbox_nums): |
is_rusinov@29
|
221 if value: |
is_rusinov@29
|
222 nums.append(i) |
is_rusinov@29
|
223 if self.keys.has_key(key): |
is_rusinov@29
|
224 error.config(text="State with such key has already existed") |
is_rusinov@29
|
225 state_key.focus() |
is_rusinov@29
|
226 elif len(key) != 1: |
is_rusinov@29
|
227 error.config(text="Bad key for state") |
is_rusinov@29
|
228 state_key.focus() |
is_rusinov@29
|
229 elif automata.symbols.has_key(symbol): |
is_rusinov@29
|
230 error.config(text="State with such symbol has already existed") |
is_rusinov@29
|
231 state_symbol.focus() |
is_rusinov@29
|
232 elif len(symbol) != 1: |
is_rusinov@29
|
233 error.config(text="Bad symbol for state") |
is_rusinov@29
|
234 state_symbol.focus() |
is_rusinov@29
|
235 else: |
is_rusinov@29
|
236 state = State(name, symbol, color, nums) |
is_rusinov@29
|
237 automata.states.append(state) |
is_rusinov@29
|
238 automata.symbols(symbol) = len(automata.states) - 1 |
is_rusinov@29
|
239 self.keys(key) = len(automata.states) - 1 |
is_rusinov@5
|
240 |
is_rusinov@18
|
241 def change(self):# change chosen state |
Ilia@2
|
242 pass |
is_rusinov@18
|
243 def show_size_window(self): |
is_rusinov@18
|
244 size_window.deiconify() |
is_rusinov@18
|
245 def hide_size_window(self): |
is_rusinov@18
|
246 size_window.withdraw() |
Ilia@6
|
247 |
Ilia@6
|
248 |
Ilia@6
|
249 root = Tk() |
Ilia@6
|
250 root.title("Cyclyc Cell Automata") |
Ilia@6
|
251 |
Ilia@6
|
252 canvas = Canvas(root, background="white") |
Ilia@6
|
253 canvas.config(width=500, height=400) |
Ilia@6
|
254 canvas.pack(fill="both", expand="yes") |
Ilia@6
|
255 |
darkhan@32
|
256 automata = Automata(50, 50) |
Ilia@6
|
257 handlers = Handlers(1, 1, 0, 0) |
Ilia@6
|
258 |
Ilia@6
|
259 states = [] |
Ilia@6
|
260 symboles = dict() |
Ilia@6
|
261 |
Ilia@6
|
262 #infoPanel=Frame |
is_rusinov@18
|
263 automata_frame=Frame(root, background="grey") |
Ilia@9
|
264 |
Ilia@9
|
265 headline_frame=Frame(automata_frame, background="white") |
Ilia@9
|
266 head = Label(headline_frame, text= "Automata Panel", font=16) |
Ilia@9
|
267 head.pack(side="left", expand="yes") |
Ilia@9
|
268 hide = Button(headline_frame, text="X", command=automata_frame.forget) |
Ilia@9
|
269 hide.config(bg="grey") |
Ilia@9
|
270 hide.pack(side="right") |
Ilia@9
|
271 headline_frame.pack(side="top",fill="both", expand="no") |
Ilia@9
|
272 |
Ilia@9
|
273 Label(automata_frame, text= "State Box:").pack(side="top", fill="x") |
Ilia@9
|
274 state_list=Listbox(automata_frame, selectmode="extended") |
Ilia@6
|
275 for state in states: |
is_rusinov@7
|
276 state_list.insert("end", state) |
is_rusinov@7
|
277 state_list.pack(side="top", fill="y") |
Ilia@19
|
278 up = Button(automata_frame, text="Up", state="disabled") |
Ilia@6
|
279 up.config(bg="red") |
Ilia@19
|
280 down = Button(automata_frame, text="Down", state="disabled") |
Ilia@6
|
281 down.config(bg="orange") |
Ilia@19
|
282 to_top = Button(automata_frame, text="To Top", state="disabled") |
Ilia@6
|
283 to_top.config(bg="yellow") |
Ilia@19
|
284 to_bottom = Button(automata_frame, text="To Bottom", state="disabled") |
Ilia@6
|
285 to_bottom.config(bg="green") |
Ilia@19
|
286 delete = Button(automata_frame, text="Delete", state="disabled") |
Ilia@9
|
287 delete.config(bg="cyan") |
Ilia@6
|
288 up.pack(side="top", fill="x") |
Ilia@6
|
289 down.pack(side="top", fill="x") |
Ilia@6
|
290 to_top.pack(side="top", fill="x") |
Ilia@6
|
291 to_bottom.pack(side="top", fill="x") |
Ilia@9
|
292 delete.pack(side="top", fill="x") |
Ilia@6
|
293 |
Ilia@6
|
294 |
Ilia@9
|
295 information = Label(automata_frame, text= "Information of State") |
Ilia@9
|
296 information.pack(side="top", fill="x") |
Ilia@9
|
297 info_frame=Frame(automata_frame, background="white") |
Ilia@9
|
298 Label(info_frame, text="Name").grid(row=0, column=0) |
Ilia@9
|
299 state_name = Entry(info_frame) |
Ilia@9
|
300 state_name.grid(row=0, column=1) |
Ilia@9
|
301 Label(info_frame, text="Symbol").grid(row=1, column=0) |
Ilia@9
|
302 state_symbol = Entry(info_frame) |
Ilia@9
|
303 state_symbol.grid(row=1, column=1) |
Ilia@9
|
304 Label(info_frame, text="Color").grid(row=2, column=0) |
Ilia@9
|
305 state_color = Entry(info_frame) |
Ilia@9
|
306 state_color.grid(row=2, column=1) |
Ilia@9
|
307 Label(info_frame, text="Key").grid(row=3, column=0) |
Ilia@9
|
308 state_key = Entry(info_frame) |
Ilia@9
|
309 state_key.grid(row=3, column=1) |
Ilia@9
|
310 info_frame.pack(side="top") |
Ilia@9
|
311 |
Ilia@9
|
312 |
Ilia@33
|
313 check_box = [0, 0, 0, 0, 0, 0, 0, 0, 0] |
Ilia@33
|
314 |
Ilia@9
|
315 condition = Label(automata_frame, text= "Condition of conversion") |
Ilia@9
|
316 condition.pack(side="top", fill="x") |
Ilia@9
|
317 condition_frame=Frame(automata_frame, background="white") |
Ilia@9
|
318 Label(condition_frame, text="0: ").grid(row=0, column=0) |
Ilia@33
|
319 c_box_0 = Checkbutton(condition_frame, variable = check_box[0], onvalue = 1, offvalue = 0) |
Ilia@33
|
320 c_box_0.grid(row=0, column=1) |
Ilia@9
|
321 Label(condition_frame, text="1: ").grid(row=0, column=2) |
Ilia@33
|
322 c_box_1 = Checkbutton(condition_frame, variable = check_box[1], onvalue = 1, offvalue = 0) |
Ilia@33
|
323 c_box_1.grid(row=0, column=3) |
Ilia@9
|
324 Label(condition_frame, text="2: ").grid(row=0, column=4) |
Ilia@33
|
325 c_box_2 = Checkbutton(condition_frame, variable = check_box[2], onvalue = 1, offvalue = 0) |
Ilia@33
|
326 c_box_2.grid(row=0, column=5) |
Ilia@9
|
327 Label(condition_frame, text="3: ").grid(row=1, column=0) |
Ilia@33
|
328 c_box_3 = Checkbutton(condition_frame, variable = check_box[3], onvalue = 1, offvalue = 0) |
Ilia@33
|
329 c_box_3.grid(row=1, column=1) |
Ilia@9
|
330 Label(condition_frame, text="4: ").grid(row=1, column=2) |
Ilia@33
|
331 c_box_4 = Checkbutton(condition_frame, variable = check_box[4], onvalue = 1, offvalue = 0) |
Ilia@33
|
332 c_box_4.grid(row=1, column=3) |
Ilia@9
|
333 Label(condition_frame, text="5: ").grid(row=1, column=4) |
Ilia@33
|
334 c_box_5 = Checkbutton(condition_frame, variable = check_box[5], onvalue = 1, offvalue = 0) |
Ilia@33
|
335 c_box_5.grid(row=1, column=5) |
Ilia@9
|
336 Label(condition_frame, text="6: ").grid(row=2, column=0) |
Ilia@33
|
337 c_box_6 = Checkbutton(condition_frame, variable = check_box[6], onvalue = 1, offvalue = 0) |
Ilia@33
|
338 c_box_6.grid(row=2, column=1) |
Ilia@9
|
339 Label(condition_frame, text="7: ").grid(row=2, column=2) |
Ilia@33
|
340 c_box_7 = Checkbutton(condition_frame, variable = check_box[7], onvalue = 1, offvalue = 0) |
Ilia@33
|
341 c_box_7.grid(row=2, column=3) |
Ilia@9
|
342 Label(condition_frame, text="8: ").grid(row=2, column=4) |
Ilia@33
|
343 c_box_8 = Checkbutton(condition_frame, variable = check_box[8], onvalue = 1, offvalue = 0) |
Ilia@33
|
344 c_box_8.grid(row=2, column=5) |
Ilia@9
|
345 condition_frame.pack(side="top") |
Ilia@9
|
346 |
Ilia@9
|
347 |
Ilia@19
|
348 add_state = Button(automata_frame, text="ADD", state="disabled") |
Ilia@9
|
349 add_state.config(bg="blue") |
Ilia@19
|
350 change_state = Button(automata_frame, text="Change", state="disabled") |
Ilia@9
|
351 change_state.config(bg="violet") |
Ilia@9
|
352 add_state.pack(side="top", fill="x") |
Ilia@9
|
353 change_state.pack(side="top", fill="x") |
Ilia@9
|
354 |
Ilia@9
|
355 error=Label(automata_frame) |
Ilia@9
|
356 error.pack(side="top", fill="x") |
is_rusinov@8
|
357 |
is_rusinov@8
|
358 |
Ilia@12
|
359 side = 0 |
Ilia@12
|
360 |
Ilia@12
|
361 size_window = Toplevel(root) |
Ilia@12
|
362 size_window.title("") |
Ilia@13
|
363 size_window.withdraw() |
Ilia@12
|
364 size_window.protocol("WM_DELETE_WINDOW", handlers.hide_size_window) |
Ilia@12
|
365 Label(size_window, text= "Current size of window:").pack(side="top", fill="x") |
Ilia@19
|
366 size = Label(size_window, text= str(len(automata.field)) + " x " + str(len(automata.field[0]))) |
Ilia@19
|
367 size.pack(side="top", fill="x") |
Ilia@12
|
368 Label(size_window, text= "New size:").pack(side="top", fill="x") |
Ilia@12
|
369 new_size = Frame(size_window) |
Ilia@12
|
370 size_x = Entry(new_size, width=5) |
Ilia@12
|
371 size_x.grid(row=0, column=0) |
Ilia@12
|
372 Label(new_size, text=" x ").grid(row=0, column=1) |
Ilia@12
|
373 size_y = Entry(new_size, width=5) |
Ilia@12
|
374 size_y.grid(row=0, column=2) |
Ilia@12
|
375 new_size.pack(side="top") |
Ilia@12
|
376 Label(size_window, text= "Expansion of window:").pack(side="top", fill="x") |
Ilia@12
|
377 expansion = Frame(size_window) |
Ilia@12
|
378 r0 = Radiobutton(expansion, variable=side, value = 0, indicatoron=0, width=2, height=1) |
Ilia@12
|
379 r0.select() |
Ilia@12
|
380 r0.grid(row=0, column=0) |
Ilia@12
|
381 r1 = Radiobutton(expansion, variable=side, value = 1, indicatoron=0, width=2, height=1) |
Ilia@12
|
382 r1.grid(row=0, column=1) |
Ilia@12
|
383 r2 = Radiobutton(expansion, variable=side, value = 2, indicatoron=0, width=2, height=1) |
Ilia@12
|
384 r2.grid(row=0, column=2) |
Ilia@12
|
385 r3 = Radiobutton(expansion, variable=side, value = 3, indicatoron=0, width=2, height=1) |
Ilia@12
|
386 r3.grid(row=1, column=0) |
Ilia@12
|
387 r4 = Radiobutton(expansion, variable=side, value = 4, indicatoron=0, width=2, height=1) |
Ilia@12
|
388 r4.grid(row=1, column=1) |
Ilia@12
|
389 r5 = Radiobutton(expansion, variable=side, value = 5, indicatoron=0, width=2, height=1) |
Ilia@12
|
390 r5.grid(row=1, column=2) |
Ilia@12
|
391 r6 = Radiobutton(expansion, variable=side, value = 6, indicatoron=0, width=2, height=1) |
Ilia@12
|
392 r6.grid(row=2, column=0) |
Ilia@12
|
393 r7 = Radiobutton(expansion, variable=side, value = 7, indicatoron=0, width=2, height=1) |
Ilia@12
|
394 r7.grid(row=2, column=1) |
Ilia@12
|
395 r8 = Radiobutton(expansion, variable=side, value = 8, indicatoron=0, width=2, height=1) |
Ilia@12
|
396 r8.grid(row=2, column=2) |
Ilia@12
|
397 expansion.pack(side="top") |
Ilia@12
|
398 Label(size_window).pack(side="top", fill="x") |
Ilia@12
|
399 apply_frame = Frame(size_window, padx=10, pady=5) |
Ilia@12
|
400 apply_size = Button(apply_frame, text="Apply") |
Ilia@12
|
401 apply_size.config(bg="yellow") |
Ilia@12
|
402 apply_size.pack(side="left", fill="x") |
Ilia@12
|
403 close_size = Button(apply_frame, text="Close", command=handlers.hide_size_window) |
Ilia@12
|
404 close_size.config(bg="green") |
Ilia@12
|
405 close_size.pack(side="right", fill="x") |
Ilia@12
|
406 apply_frame.pack(side="top", fill="x") |
Ilia@12
|
407 |
Ilia@6
|
408 menubar = Menu(root) |
Ilia@6
|
409 root.config(menu=menubar) |
Ilia@6
|
410 |
Ilia@6
|
411 menu_file = Menu(menubar) |
Ilia@6
|
412 menu_file.add_command(label="New") |
Ilia@9
|
413 menu_file.add_command(label="Open...", command=handlers.open_file) |
Ilia@9
|
414 menu_file.add_command(label="Save...", command=handlers.save_file) |
Ilia@6
|
415 menu_file.add_separator() |
Ilia@9
|
416 menu_file.add_command(label="Exit", command=root.destroy) |
Ilia@6
|
417 menubar.add_cascade(label="File", menu=menu_file) |
Ilia@6
|
418 |
Ilia@6
|
419 menu_action = Menu(menubar) |
Ilia@9
|
420 menu_action.add_command(label="Start", command=handlers.start) |
Ilia@9
|
421 menu_action.add_command(label="Stop", command=handlers.stop) |
Ilia@9
|
422 menu_action.add_command(label="Next Step", command=handlers.next_step) |
Ilia@12
|
423 menu_action.add_separator() |
Ilia@9
|
424 menu_action.add_command(label="Increase speed", command=handlers.faster) |
Ilia@9
|
425 menu_action.add_command(label="Decrease speed", command=handlers.slower) |
Ilia@12
|
426 menu_action.add_separator() |
Ilia@9
|
427 menu_action.add_command(label="Zoom In", command=handlers.zoom_in) |
Ilia@9
|
428 menu_action.add_command(label="Zoom Out", command=handlers.zoom_out) |
Ilia@12
|
429 menu_action.add_separator() |
Ilia@6
|
430 menu_action.add_command(label="Clean field") |
Ilia@6
|
431 menu_action.add_command(label="Fill randomly") |
Ilia@13
|
432 menu_action.add_separator() |
Ilia@12
|
433 menu_action.add_command(label="Change size",command=handlers.show_size_window) |
Ilia@6
|
434 menubar.add_cascade(label="Action", menu=menu_action) |
Ilia@6
|
435 |
is_rusinov@7
|
436 menubar.add_command(label="Automata", command=handlers.automata_frame) |
Ilia@6
|
437 |
Ilia@12
|
438 menubar.add_command(label="Help", command=handlers.help) |
Ilia@6
|
439 |
Ilia@6
|
440 root.mainloop() |
Ilia@6
|
441
|