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