Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.fbb.msu.ru/hg/cca/raw-annotate/7502b6193014/Interface.py
Дата изменения: Unknown
Дата индексирования: Sun Feb 3 15:07:13 2013
Кодировка:

is_rusinov@64: import math
is_rusinov@64: import tkColorChooser
Ilia@6: from Tkinter import *
Ilia@2:
is_rusinov@18: from State import *
is_rusinov@18: from Automata import *
is_rusinov@18:
is_rusinov@18:
Ilia@2: class Handlers(object):
is_rusinov@5:
is_rusinov@54: 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: self.cell_size = cell_size
is_rusinov@18: self.line_width = line_width
is_rusinov@7: self.delay = delay
Ilia@6: self.offset_x = offset_x
Ilia@6: self.offset_y = offset_y
is_rusinov@5: self.after_id = 0
is_rusinov@51: self.mouse_offset_x = 0
is_rusinov@51: self.mouse_offset_y = 0
is_rusinov@18: self.mouse_zoom = 0
is_rusinov@54: self.zoom_divisor = 1
is_rusinov@64: self.selected_state = None
is_rusinov@7: self.is_started = False
is_rusinov@54: self.char = None
is_rusinov@18: self.keys = dict()
is_rusinov@29: self.draw()
is_rusinov@5: def start(self):
is_rusinov@8: if not self.is_started:
is_rusinov@7: self.is_started = True
is_rusinov@43: self.repeat()
is_rusinov@43: def repeat(self):
is_rusinov@43: self.next_step()
is_rusinov@43: self.after_id = canvas.after(self.delay, self.repeat)
is_rusinov@5:
is_rusinov@5: def stop(self):
is_rusinov@29: canvas.after_cancel(self.after_id)
is_rusinov@7: self.is_started = False
is_rusinov@5:
is_rusinov@5: def next_step(self):
is_rusinov@53: self.draw_cell(automata.next_step())
is_rusinov@5:
is_rusinov@18: def save_file(self):
Ilia@2: pass
is_rusinov@5:
is_rusinov@18: def open_file(self):
Ilia@2: pass
is_rusinov@5:
is_rusinov@29: def show_help_window(self):
Ilia@2: pass
is_rusinov@5:
is_rusinov@29: def hide_help_window(self):
is_rusinov@8: pass
is_rusinov@8:
is_rusinov@8: def zoom_in(self, zoom_rate=1):
is_rusinov@7: if self.cell_size < 50:
is_rusinov@8: self.cell_size = self.cell_size + zoom_rate
is_rusinov@7: self.draw()
is_rusinov@5:
is_rusinov@8: def zoom_out(self, zoom_rate=1):
is_rusinov@7: if self.cell_size > 1:
is_rusinov@8: self.cell_size = self.cell_size - zoom_rate
is_rusinov@7: self.draw()
is_rusinov@5:
is_rusinov@8: def slower(self, speed_rate=1):
is_rusinov@7: self.delay = self.delay + speed_rate
is_rusinov@5:
is_rusinov@8: def faster(self, speed_rate=1):
is_rusinov@29: if self.delay > speed_rate:
is_rusinov@7: self.delay = self.delay - speed_rate
is_rusinov@7: else:
is_rusinov@7: self.delay = 0
is_rusinov@5:
is_rusinov@18: def change_size(self, dx, dy, position=0):
is_rusinov@8: if position < 9:
is_rusinov@8: if position == 0 or position == 3 or position == 6:
is_rusinov@8: automata.change_size(dx, 3)
is_rusinov@8: elif position == 1 or position == 4 or position == 7:
is_rusinov@8: automata.change_size(dx / 2, 3)
is_rusinov@8: automata.change_size(dx - dx / 2, 1)
is_rusinov@18: else:
is_rusinov@8: automata.change_size(dx, 1)
is_rusinov@8: if position == 0 or position == 1 or position == 2:
is_rusinov@8: automata.change_size(dy, 0)
is_rusinov@8: elif position == 3 or position == 4 or position == 5:
is_rusinov@8: automata.change_size(dy / 2, 0)
is_rusinov@8: automata.change_size(dy - dy / 2, 2)
is_rusinov@18: else:
is_rusinov@8: automata.change_size(dy, 2)
is_rusinov@8: self.draw()
is_rusinov@5:
darkhan@50: def draw_cell(self, cells):
darkhan@50: for row, col in cells:
darkhan@42: index = automata.symbols[automata.field[row][col]]
darkhan@42: color = automata.states[index].color
darkhan@42: canvas.itemconfig(self.cells[row][col], fill=color)
darkhan@42:
darkhan@32: def draw(self):
darkhan@31: canvas.delete("all")
darkhan@42: self.cells = []
darkhan@31:
darkhan@31: shift = self.cell_size + self.line_width
darkhan@42:
darkhan@42: left = -self.offset_x + self.line_width
darkhan@42: top = -self.offset_y + self.line_width
darkhan@31: for row in range(automata.height):
darkhan@42: self.cells.append([])
darkhan@31: for col in range(automata.width):
darkhan@31: index = automata.symbols[automata.field[row][col]]
darkhan@31: color = automata.states[index].color
darkhan@42: cell = canvas.create_rectangle(left + col * shift,
darkhan@31: top + row * shift,
darkhan@31: left + col * shift + self.cell_size,
darkhan@31: top + row * shift + self.cell_size,
darkhan@50: fill=color, outline="", tag="cell")
darkhan@42: self.cells[row].append(cell)
is_rusinov@5:
is_rusinov@64: def draw_line(self, x1, y1, x2, y2, order=1):
is_rusinov@64: answer = []
is_rusinov@64: if abs(x1 - x2) > abs(y1 - y2):
is_rusinov@64: dx = x2 - x1
is_rusinov@64: abs_dx = abs(dx)
is_rusinov@64: dy = float(y2 - y1)
is_rusinov@64: while x1 != x2:
is_rusinov@64: x1 = x1 + dx / abs_dx
is_rusinov@64: y1 = y1 + dy / abs_dx
is_rusinov@64: answer.append((self.rounding(y1), x1))
is_rusinov@64: else:
is_rusinov@64: dx = float(x2 - x1)
is_rusinov@64: dy = y2 - y1
is_rusinov@64: abs_dy = abs(dy)
is_rusinov@64: while y1 != y2:
is_rusinov@64: x1 = x1 + dx / abs_dy
is_rusinov@64: y1 = y1 + dy / abs_dy
is_rusinov@64: answer.append((y1, self.rounding(x1)))
is_rusinov@64: self.new_state(answer, order)
is_rusinov@64:
is_rusinov@64: def rounding(self, num):
is_rusinov@64: return int(num + math.copysign(0.5, num))
is_rusinov@64:
is_rusinov@64: def new_state(self, cells, order=1):
is_rusinov@64: num_states = len(automata.states)
is_rusinov@64: changed_cells = []
is_rusinov@64: for row, col in cells:
is_rusinov@64: if col >= 0 and row >= 0:
is_rusinov@64: try:
is_rusinov@64: index = (automata.symbols[automata.field[row][col]] + num_states + order) % num_states
is_rusinov@64: if self.char != None and self.keys.has_key(self.char):
is_rusinov@64: index = self.keys[self.char]
is_rusinov@64: automata.field[row][col] = automata.states[index].symbol
is_rusinov@64: changed_cells.append((row, col))
is_rusinov@64: except:
is_rusinov@64: pass
is_rusinov@64: self.draw_cell(changed_cells)
is_rusinov@64:
is_rusinov@7: def press1(self, event):# drawer
is_rusinov@64: self.col1 = event.x / (self.cell_size + self.line_width) - self.offset_x
is_rusinov@64: self.row1 = event.y / (self.cell_size + self.line_width) - self.offset_y
is_rusinov@64: if self.col1 >= 0 and self.row1 >= 0:
is_rusinov@64: self.new_state([(self.row1, self.col1)])
is_rusinov@64:
is_rusinov@64: def motion1(self, event):# drawer
is_rusinov@64: col = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width)
is_rusinov@26: row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width)
is_rusinov@64: if not (self.col1 == col and self.row1 == row):
is_rusinov@64: if abs(self.col1 - col) <= 1 and abs(self.row1 - row) <= 1:
is_rusinov@64: self.new_state([(row, col)])
is_rusinov@64: else:
is_rusinov@64: self.draw_line(self.col1, self.row1, col, row)
is_rusinov@64: self.col1 = col
is_rusinov@64: self.row1 = row
is_rusinov@5:
is_rusinov@7: def press3(self, event):# drawer
is_rusinov@64: self.col3 = event.x / (self.cell_size + self.line_width) - self.offset_x
is_rusinov@64: self.row3 = event.y / (self.cell_size + self.line_width) - self.offset_y
is_rusinov@64: if self.col1 >= 0 and self.row1 >= 0:
is_rusinov@64: self.new_state([(self.row3, self.col3)], -1)
is_rusinov@54:
is_rusinov@64: def motion3(self, event):# drawer
is_rusinov@64: col = (event.x - self.offset_x * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width)
is_rusinov@26: row = (event.y - self.offset_y * (self.cell_size + self.line_width)) / (self.cell_size + self.line_width)
is_rusinov@64: if not (self.col3 == col and self.row3 == row):
is_rusinov@64: if abs(self.col3 - col) <= 1 and abs(self.row3 - row) <= 1:
is_rusinov@64: self.new_state([(row, col)], -1)
is_rusinov@64: else:
is_rusinov@64: self.draw_line(self.col3, self.row3, col, row, -1)
is_rusinov@64: self.col3 = col
is_rusinov@64: self.row3 = row
is_rusinov@5:
is_rusinov@54: def press_key(self, event):# drawer
is_rusinov@54: self.char = event.char
is_rusinov@5:
is_rusinov@54: def release_key(self, event):# drawer
is_rusinov@54: self.char = None
is_rusinov@18:
is_rusinov@43: def press1_ctrl(self, event):# change_offset (B1+ctrl)
is_rusinov@54: canvas.focus_set()
is_rusinov@51: self.mouse_offset_x = event.x
is_rusinov@51: self.mouse_offset_y = event.y
is_rusinov@18:
is_rusinov@43: def motion1_ctrl(self, event):# change_offset (B1+ctrl)
is_rusinov@51: self.offset_x = (event.x - self.mouse_offset_x) / (self.cell_size + self.line_width)
is_rusinov@51: self.offset_y = (event.y - self.mouse_offset_y) / (self.cell_size + self.line_width)
is_rusinov@51: self.mouse_offset_x = event.x
is_rusinov@51: self.mouse_offset_y = event.y
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@43: def press13(self, event):# zoom
is_rusinov@54: canvas.focus_set()
is_rusinov@18: self.mouse_zoom = event.y
is_rusinov@5:
is_rusinov@43: def motion13(self, event):# zoom
is_rusinov@18: delta = (event.y - self.mouse_zoom) / self.zoom_divisor
is_rusinov@18: self.cell_size = self.cell_size + delta
is_rusinov@18: if self.cell_size > 50:
is_rusinov@18: self.cell_size = 50
is_rusinov@18: if self.cell_size < 1:
is_rusinov@18: self.cell_size = 1
is_rusinov@18: self.mouse_zoom = event.y
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@8: def to_top(self):# replace choosen state to top
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: state = automata.states[index]
is_rusinov@58: print state
is_rusinov@58: del automata.states[index]
is_rusinov@58: automata.states.insert(0, state)
is_rusinov@64: self.selected_state = 0
is_rusinov@58: self.refresh_list()
is_rusinov@7:
is_rusinov@8: def to_bottom(self):# replace choosen state to botton
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: state = automata.states[index]
is_rusinov@58: print state
is_rusinov@58: del automata.states[index]
is_rusinov@58: automata.states.append(state)
is_rusinov@64: self.selected_state = len(automata.states) - 1
is_rusinov@58: self.refresh_list()
is_rusinov@7:
is_rusinov@8: def upwards(self):
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: if index > 0:
is_rusinov@58: state = automata.states[index]
is_rusinov@58: print state
is_rusinov@58: del automata.states[index]
is_rusinov@58: automata.states.insert(index - 1, state)
is_rusinov@64: self.selected_state = index - 1
is_rusinov@58: self.refresh_list()
is_rusinov@7:
is_rusinov@8: def downwards(self):
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: if index < state_list.size() - 1:
is_rusinov@58: state = automata.states[index]
is_rusinov@58: print state
is_rusinov@58: del automata.states[index]
is_rusinov@58: automata.states.insert(index + 1, state)
is_rusinov@64: self.selected_state = index + 1
is_rusinov@58: self.refresh_list()
is_rusinov@7:
is_rusinov@8: def delete_state(self):# delete choosen state
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: print automata.states[index]
is_rusinov@58: del automata.symbols[automata.states[index].symbol]
is_rusinov@58: for key in self.keys.keys():
is_rusinov@58: if self.keys[key] == index:
is_rusinov@58: del self.keys[key]
is_rusinov@66: del automata.st_sym[automata.states[index].symbol]
is_rusinov@65: del automata.states[index]
is_rusinov@65: if index in automata.states:
is_rusinov@65: self.selected_state = index
is_rusinov@65: elif len(automata.states):
is_rusinov@65: self.selected_state = len(automata.states) - 1
is_rusinov@65: else:
is_rusinov@65: self.selected_state = None
is_rusinov@58: self.refresh_list()
is_rusinov@65: self.select_item(self.selected_state)
is_rusinov@7:
is_rusinov@18: def add(self):# add new state
is_rusinov@29: name = state_name.get()
is_rusinov@48: symbol = state_symbol.get()
is_rusinov@54: key = state_key.get().lower()
is_rusinov@64: color = state_color.cget("bg")
is_rusinov@29: nums = []
is_rusinov@29: for i, value in enumerate(ckeckbox_nums):
is_rusinov@65: if value.get() == 1:
is_rusinov@65: nums.append(i)
is_rusinov@54: if self.keys.has_key(key):
is_rusinov@29: error.config(text="State with such key has already existed")
is_rusinov@29: state_key.focus()
is_rusinov@29: elif len(key) != 1:
is_rusinov@29: error.config(text="Bad key for state")
is_rusinov@29: state_key.focus()
is_rusinov@29: elif automata.symbols.has_key(symbol):
is_rusinov@29: error.config(text="State with such symbol has already existed")
is_rusinov@29: state_symbol.focus()
is_rusinov@29: elif len(symbol) != 1:
is_rusinov@29: error.config(text="Bad symbol for state")
is_rusinov@29: state_symbol.focus()
is_rusinov@29: else:
is_rusinov@29: state = State(name, symbol, color, nums)
is_rusinov@29: automata.states.append(state)
is_rusinov@34: automata.symbols[symbol] = len(automata.states) - 1
is_rusinov@34: self.keys[key] = len(automata.states) - 1
is_rusinov@58: error.config(text="")
is_rusinov@65: self.selected_state = len(automata.states) - 1
is_rusinov@58: self.refresh_list()
is_rusinov@65: self.select_item(self.selected_state)
is_rusinov@66: automata.st_sym[symbol] = state
is_rusinov@5:
is_rusinov@18: def change(self):# change chosen state
is_rusinov@64: selected = self.selected_state
is_rusinov@64: if selected != None:
is_rusinov@64: index = selected
is_rusinov@58: name = state_name.get()
is_rusinov@58: symbol = state_symbol.get()
is_rusinov@58: key = state_key.get().lower()
is_rusinov@64: color = state_color.cget("bg")
is_rusinov@58: nums = []
is_rusinov@58: for i, value in enumerate(ckeckbox_nums):
is_rusinov@58: if value.get() == 1:
is_rusinov@58: nums.append(i)
is_rusinov@58: if self.keys.has_key(key) and self.keys[key] != index:
is_rusinov@58: error.config(text="State with such key has already existed")
is_rusinov@58: state_key.focus()
is_rusinov@58: elif len(key) != 1:
is_rusinov@58: error.config(text="Bad key for state")
is_rusinov@58: state_key.focus()
is_rusinov@58: elif automata.symbols.has_key(symbol) and automata.symbols[symbol] != index:
is_rusinov@58: error.config(text="State with such symbol has already existed")
is_rusinov@58: state_symbol.focus()
is_rusinov@58: elif len(symbol) != 1:
is_rusinov@58: error.config(text="Bad symbol for state")
is_rusinov@58: state_symbol.focus()
is_rusinov@58: else:
is_rusinov@58: state = State(name, symbol, color, nums)
is_rusinov@66: del automata.symbols[automata.states[index].symbol]
is_rusinov@58: automata.symbols[symbol] = index
is_rusinov@66: del automata.st_sym[automata.states[index].symbol]
is_rusinov@66: automata.st_sym[symbol] = state
is_rusinov@58: self.keys[key] = index
is_rusinov@58: error.config(text="")
is_rusinov@66: automata.states[index] = state
is_rusinov@58: self.refresh_list()
is_rusinov@54:
is_rusinov@18: def show_size_window(self):
is_rusinov@18: size_window.deiconify()
Ilia@55:
is_rusinov@18: def hide_size_window(self):
is_rusinov@18: size_window.withdraw()
Ilia@55:
Ilia@55: def show_automata_window(self):
Ilia@55: automata_window.deiconify()
Ilia@55:
Ilia@55: def hide_automata_window(self):
Ilia@55: automata_window.withdraw()
is_rusinov@65:
is_rusinov@58: def refresh_list(self):
is_rusinov@58: state_list.delete(0, "end")
is_rusinov@58: for state in automata.states:
is_rusinov@58: state_list.insert("end", state)
is_rusinov@64: if self.selected_state != None:
is_rusinov@64: state_list.selection_set(self.selected_state)
is_rusinov@65:
is_rusinov@65: def select_item(self, index):
is_rusinov@65: if index != None:
is_rusinov@58: state = automata.states[index]
is_rusinov@58: state_name.delete(0, "end")
is_rusinov@58: state_name.insert(0, state.name)
is_rusinov@58: state_symbol.delete(0, "end")
is_rusinov@58: state_symbol.insert(0, state.symbol)
is_rusinov@58: for key in self.keys.keys():
is_rusinov@58: if self.keys[key] == index:
is_rusinov@58: state_key.delete(0, "end")
is_rusinov@58: state_key.insert(0, key)
is_rusinov@64: state_color.config(bg=state.color)
is_rusinov@58: for i in range(9):
is_rusinov@58: ckeckbox_nums[i].set(i in state.nums)
is_rusinov@65: else:
is_rusinov@65: state_name.delete(0, "end")
is_rusinov@65: state_symbol.delete(0, "end")
is_rusinov@65: state_key.delete(0, "end")
is_rusinov@65: state_color.config(bg="white")
is_rusinov@65: for i in range(9):
is_rusinov@65: ckeckbox_nums[i].set(False)
is_rusinov@64:
is_rusinov@65: def list_mouse_release(self, event):
is_rusinov@65: selected = state_list.curselection()
is_rusinov@65: self.selected_state = int(selected[0])
is_rusinov@65: if len(selected):
is_rusinov@65: self.select_item(self.selected_state)
is_rusinov@64: def choose_color(self, event):
is_rusinov@64: state_color.config(bg=tkColorChooser.askcolor()[1])
Ilia@55:
Ilia@6:
Ilia@6: root = Tk()
Ilia@36: root.title("Cyclic Cellular Automata")
Ilia@6:
darkhan@42: canvas = Canvas(root, background="grey")
Ilia@6: canvas.config(width=500, height=400)
Ilia@6:
is_rusinov@54: automata = Automata()
Ilia@36: handlers = Handlers()
Ilia@36:
is_rusinov@54: canvas.tag_bind("cell", "<1>", handlers.press1)
is_rusinov@64: canvas.tag_bind("cell", "", handlers.motion1)
is_rusinov@54: canvas.tag_bind("cell", "<3>", handlers.press3)
is_rusinov@64: canvas.tag_bind("cell", "", handlers.motion3)
is_rusinov@54: canvas.bind_all("", handlers.press_key)
is_rusinov@54: canvas.bind_all("", handlers.release_key)
is_rusinov@54: #canvas.bind("", handlers.press1_ctrl)
is_rusinov@54: #canvas.bind("", handlers.motion1_ctrl)
is_rusinov@54: #canvas.bind("", handlers.press13)
is_rusinov@54: #canvas.bind("", handlers.motion13)
Ilia@36:
Ilia@36: canvas.pack(fill="both", expand="yes")
Ilia@6:
Ilia@6: #infoPanel=Frame
Ilia@55: automata_window = Toplevel(root)
Ilia@55: automata_window.title("Automata")
Ilia@55: automata_window.withdraw()
Ilia@55: automata_window.resizable(False, False)
Ilia@55: automata_window.protocol("WM_DELETE_WINDOW", handlers.hide_automata_window)
Ilia@9:
Ilia@55: headline = Label(automata_window, text= "Automata Panel", font=16)
Ilia@55: headline.pack(side="top",fill="both", expand="no")
Ilia@9:
Ilia@55: Label(automata_window, text= "State Box:").pack(side="top", fill="x")
Ilia@56:
Ilia@56: list_frame=Frame(automata_window)
Ilia@56: scrollbar = Scrollbar(list_frame)
Ilia@57: scrollbar.pack(side="right", fill="y")
is_rusinov@58: state_list=Listbox(list_frame, yscrollcommand=scrollbar.set, activestyle="none", selectmode="single")
is_rusinov@58: handlers.refresh_list()
is_rusinov@58: state_list.bind("", handlers.list_mouse_release)
is_rusinov@7: state_list.pack(side="top", fill="y")
Ilia@56: scrollbar.config(command=state_list.yview)
Ilia@56: list_frame.pack(side="top")
Ilia@56:
Ilia@59: manip_frame1 = Frame(automata_window, padx=10, pady=5)
Ilia@59: up = Button(manip_frame1, text="Up", command=handlers.upwards, width=10)
Ilia@59: to_top = Button(manip_frame1, text="To Top", command=handlers.to_top, width=10)
Ilia@59: up.pack(side="left", fill="x")
Ilia@59: to_top.pack(side="right", fill="x")
Ilia@59: manip_frame1.pack(side="top", fill="x")
Ilia@59:
Ilia@59: manip_frame2 = Frame(automata_window, padx=10, pady=5)
Ilia@59: down = Button(manip_frame2, text="Down", command=handlers.downwards, width=10)
Ilia@59: to_bottom = Button(manip_frame2, text="To Bottom", command=handlers.to_bottom, width=10)
Ilia@59: down.pack(side="left", fill="x")
Ilia@59: to_bottom.pack(side="right", fill="x")
Ilia@59: manip_frame2.pack(side="top", fill="x")
Ilia@59:
Ilia@59: delete = Button(automata_window, text="Delete", command=handlers.delete_state, width=10)
Ilia@59: delete.pack(side="top")
Ilia@6:
Ilia@6:
Ilia@55: information = Label(automata_window, text= "Information of State")
Ilia@9: information.pack(side="top", fill="x")
Ilia@55: info_frame=Frame(automata_window)
Ilia@9: Label(info_frame, text="Name").grid(row=0, column=0)
Ilia@9: state_name = Entry(info_frame)
Ilia@9: state_name.grid(row=0, column=1)
Ilia@9: Label(info_frame, text="Symbol").grid(row=1, column=0)
Ilia@9: state_symbol = Entry(info_frame)
Ilia@9: state_symbol.grid(row=1, column=1)
Ilia@60: Label(info_frame, text="Key").grid(row=2, column=0)
Ilia@9: state_key = Entry(info_frame)
Ilia@60: state_key.grid(row=2, column=1)
Ilia@60: Label(info_frame, text="Color").grid(row=3, column=0)
Ilia@60: state_color = Label(info_frame, background="white", cursor="plus")
Ilia@60: state_color.grid(row=3, column=1, sticky="ew")
is_rusinov@64: state_color.bind('<1>', handlers.choose_color)
Ilia@9: info_frame.pack(side="top")
Ilia@9:
Ilia@9:
Ilia@36: ckeckbox_nums = [IntVar(), IntVar(), IntVar(), IntVar(), IntVar(),
Ilia@36: IntVar(), IntVar(), IntVar(), IntVar()]
Ilia@33:
Ilia@55: condition = Label(automata_window, text= "Condition of conversion")
Ilia@9: condition.pack(side="top", fill="x")
Ilia@55: condition_frame=Frame(automata_window)
Ilia@9: Label(condition_frame, text="0: ").grid(row=0, column=0)
Ilia@39: c_button_0 = Checkbutton(condition_frame, variable=ckeckbox_nums[0])
Ilia@36: c_button_0.grid(row=0, column=1)
Ilia@9: Label(condition_frame, text="1: ").grid(row=0, column=2)
Ilia@39: c_button_1 = Checkbutton(condition_frame, variable=ckeckbox_nums[1])
Ilia@36: c_button_1.grid(row=0, column=3)
Ilia@9: Label(condition_frame, text="2: ").grid(row=0, column=4)
Ilia@39: c_button_2 = Checkbutton(condition_frame, variable=ckeckbox_nums[2])
Ilia@36: c_button_2.grid(row=0, column=5)
Ilia@9: Label(condition_frame, text="3: ").grid(row=1, column=0)
Ilia@39: c_button_3 = Checkbutton(condition_frame, variable=ckeckbox_nums[3])
Ilia@36: c_button_3.grid(row=1, column=1)
Ilia@9: Label(condition_frame, text="4: ").grid(row=1, column=2)
Ilia@39: c_button_4 = Checkbutton(condition_frame, variable=ckeckbox_nums[4])
Ilia@36: c_button_4.grid(row=1, column=3)
Ilia@9: Label(condition_frame, text="5: ").grid(row=1, column=4)
Ilia@39: c_button_5 = Checkbutton(condition_frame, variable=ckeckbox_nums[5])
Ilia@36: c_button_5.grid(row=1, column=5)
Ilia@9: Label(condition_frame, text="6: ").grid(row=2, column=0)
Ilia@39: c_button_6 = Checkbutton(condition_frame, variable=ckeckbox_nums[6])
Ilia@36: c_button_6.grid(row=2, column=1)
Ilia@9: Label(condition_frame, text="7: ").grid(row=2, column=2)
Ilia@39: c_button_7 = Checkbutton(condition_frame, variable=ckeckbox_nums[7])
Ilia@36: c_button_7.grid(row=2, column=3)
Ilia@9: Label(condition_frame, text="8: ").grid(row=2, column=4)
Ilia@39: c_button_8 = Checkbutton(condition_frame, variable=ckeckbox_nums[8])
Ilia@36: c_button_8.grid(row=2, column=5)
Ilia@9: condition_frame.pack(side="top")
Ilia@9:
Ilia@9:
Ilia@59: add_frame = Frame(automata_window, padx=10, pady=5)
Ilia@59: add_state = Button(add_frame, text="Add", command=handlers.add, width=10)
Ilia@59: change_state = Button(add_frame, text="Change", command=handlers.change, width=10)
Ilia@59: add_state.pack(side="left", fill="x")
Ilia@59: change_state.pack(side="right", fill="x")
Ilia@59: add_frame.pack(side="top", fill="x")
Ilia@9:
Ilia@55: error=Label(automata_window)
Ilia@9: error.pack(side="top", fill="x")
is_rusinov@8:
is_rusinov@8:
Ilia@12: side = 0
Ilia@12:
Ilia@12: size_window = Toplevel(root)
Ilia@12: size_window.title("")
Ilia@13: size_window.withdraw()
Ilia@55: size_window.resizable(False, False)
Ilia@12: size_window.protocol("WM_DELETE_WINDOW", handlers.hide_size_window)
Ilia@12: Label(size_window, text= "Current size of window:").pack(side="top", fill="x")
Ilia@19: size = Label(size_window, text= str(len(automata.field)) + " x " + str(len(automata.field[0])))
Ilia@19: size.pack(side="top", fill="x")
Ilia@12: Label(size_window, text= "New size:").pack(side="top", fill="x")
Ilia@12: new_size = Frame(size_window)
Ilia@12: size_x = Entry(new_size, width=5)
Ilia@12: size_x.grid(row=0, column=0)
Ilia@12: Label(new_size, text=" x ").grid(row=0, column=1)
Ilia@12: size_y = Entry(new_size, width=5)
Ilia@12: size_y.grid(row=0, column=2)
Ilia@12: new_size.pack(side="top")
Ilia@12: Label(size_window, text= "Expansion of window:").pack(side="top", fill="x")
Ilia@12: expansion = Frame(size_window)
Ilia@12: r0 = Radiobutton(expansion, variable=side, value = 0, indicatoron=0, width=2, height=1)
Ilia@12: r0.select()
Ilia@12: r0.grid(row=0, column=0)
Ilia@12: r1 = Radiobutton(expansion, variable=side, value = 1, indicatoron=0, width=2, height=1)
Ilia@12: r1.grid(row=0, column=1)
Ilia@12: r2 = Radiobutton(expansion, variable=side, value = 2, indicatoron=0, width=2, height=1)
Ilia@12: r2.grid(row=0, column=2)
Ilia@12: r3 = Radiobutton(expansion, variable=side, value = 3, indicatoron=0, width=2, height=1)
Ilia@12: r3.grid(row=1, column=0)
Ilia@12: r4 = Radiobutton(expansion, variable=side, value = 4, indicatoron=0, width=2, height=1)
Ilia@12: r4.grid(row=1, column=1)
Ilia@12: r5 = Radiobutton(expansion, variable=side, value = 5, indicatoron=0, width=2, height=1)
Ilia@12: r5.grid(row=1, column=2)
Ilia@12: r6 = Radiobutton(expansion, variable=side, value = 6, indicatoron=0, width=2, height=1)
Ilia@12: r6.grid(row=2, column=0)
Ilia@12: r7 = Radiobutton(expansion, variable=side, value = 7, indicatoron=0, width=2, height=1)
Ilia@12: r7.grid(row=2, column=1)
Ilia@12: r8 = Radiobutton(expansion, variable=side, value = 8, indicatoron=0, width=2, height=1)
Ilia@12: r8.grid(row=2, column=2)
Ilia@12: expansion.pack(side="top")
Ilia@12: Label(size_window).pack(side="top", fill="x")
Ilia@12: apply_frame = Frame(size_window, padx=10, pady=5)
Ilia@59: apply_size = Button(apply_frame, text="Apply", width=6)
Ilia@12: apply_size.pack(side="left", fill="x")
Ilia@59: close_size = Button(apply_frame, text="Close", command=handlers.hide_size_window, width=6)
Ilia@12: close_size.pack(side="right", fill="x")
Ilia@12: apply_frame.pack(side="top", fill="x")
Ilia@12:
Ilia@6: menubar = Menu(root)
Ilia@6: root.config(menu=menubar)
Ilia@6:
Ilia@6: menu_file = Menu(menubar)
Ilia@6: menu_file.add_command(label="New")
Ilia@9: menu_file.add_command(label="Open...", command=handlers.open_file)
Ilia@9: menu_file.add_command(label="Save...", command=handlers.save_file)
Ilia@6: menu_file.add_separator()
Ilia@9: menu_file.add_command(label="Exit", command=root.destroy)
Ilia@6: menubar.add_cascade(label="File", menu=menu_file)
Ilia@6:
Ilia@6: menu_action = Menu(menubar)
Ilia@9: menu_action.add_command(label="Start", command=handlers.start)
Ilia@9: menu_action.add_command(label="Stop", command=handlers.stop)
Ilia@9: menu_action.add_command(label="Next Step", command=handlers.next_step)
Ilia@12: menu_action.add_separator()
Ilia@9: menu_action.add_command(label="Increase speed", command=handlers.faster)
Ilia@9: menu_action.add_command(label="Decrease speed", command=handlers.slower)
Ilia@12: menu_action.add_separator()
Ilia@9: menu_action.add_command(label="Zoom In", command=handlers.zoom_in)
Ilia@9: menu_action.add_command(label="Zoom Out", command=handlers.zoom_out)
Ilia@12: menu_action.add_separator()
Ilia@6: menu_action.add_command(label="Clean field")
Ilia@6: menu_action.add_command(label="Fill randomly")
Ilia@13: menu_action.add_separator()
Ilia@12: menu_action.add_command(label="Change size",command=handlers.show_size_window)
Ilia@6: menubar.add_cascade(label="Action", menu=menu_action)
Ilia@6:
Ilia@55: menubar.add_command(label="Automata", command=handlers.show_automata_window)
Ilia@6:
is_rusinov@43: menubar.add_command(label="Help", command=handlers.show_help_window)
Ilia@6:
Ilia@6: root.mainloop()
Ilia@6: