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

cca

annotate Interface.py @ 76:cb06850ea930

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