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

cca

annotate Interface.py @ 33:313db7790397

checkbox correction
author Ilia
date Sun, 05 Dec 2010 12:35:31 +0300
parents a294fd0465d0
children 992d0179053e
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