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

cca

annotate Interface.py @ 69:ac96d7c2c7c4

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