Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/cca/annotate/f411a1e0a5cb/Interface.py
Дата изменения: Unknown
Дата индексирования: Fri Feb 28 23:48:43 2014
Кодировка:
cca: Interface.py annotate

cca

annotate Interface.py @ 51:f411a1e0a5cb

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