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

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@18: def __init__(self, cell_size=5, line_width=1 ,delay=10, offset_x=0, offset_y=0):# cell_size is size of cell, including line width, if there is it
is_rusinov@7: 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@18: self.mouse_x = 0
is_rusinov@18: self.mouse_y = 0
is_rusinov@18: self.mouse_zoom = 0
is_rusinov@18: self.zoom_divisor = 10
is_rusinov@7: self.is_started = False
is_rusinov@18: self.keys = dict()
is_rusinov@5: def start(self):
is_rusinov@8: if not self.is_started:
is_rusinov@7: self.is_started = True
is_rusinov@7: self.next_step()
is_rusinov@7: self.after_id = canvas.after(self.delay, self.start)
is_rusinov@5:
is_rusinov@5: def stop(self):
is_rusinov@5: self.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@7: automata.next_step()
is_rusinov@5: self.draw()
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@18: def help(self):
Ilia@2: pass
is_rusinov@5:
is_rusinov@18: def close_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@7: if self.speed > 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:
Ilia@2: def draw():
Ilia@2: pass
is_rusinov@5:
is_rusinov@7: def press1(self, event):# drawer
is_rusinov@26: column = (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@18: index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
is_rusinov@18: automata.field[row][column] = automata.states[index].symbol
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@7: def motion1(self, event):# drawer
is_rusinov@26: column = (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@18: index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
is_rusinov@18: automata.field[row][column] = automata.states[index].symbol
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@7: def press3(self, event):# drawer
is_rusinov@26: column = (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@18: index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
is_rusinov@18: automata.field[row][column] = automata.states[index].symbol
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@7: def motion3(self, event):# drawer
is_rusinov@26: column = (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@18: index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
is_rusinov@18: automata.field[row][column] = automata.states[index].symbol
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@18: def press1_key(self, event):# drawer
is_rusinov@18: if keys.has_key(event.char):
is_rusinov@26: column = (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@18: automata.field[row][column] = automata.states[keys[event.char]].symbol
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@18: def motion1_key(self, event):# drawer
is_rusinov@18: if keys.has_key(event.char):
is_rusinov@26: column = (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@18: automata.field[row][column] = automata.states[keys[event.char]].symbol
is_rusinov@18: self.draw()
is_rusinov@18:
is_rusinov@18: def press1_ctrl(self, event):# change_scale (B1+ctrl)
is_rusinov@18: self.mouse_x = event.x
is_rusinov@18: self.mouse_y = event.y
is_rusinov@18:
is_rusinov@18: def motion1_ctrl(self, event):# change_scale (B1+ctrl)
is_rusinov@26: self.offset_x = (event.x - self.mouse_x) / (self.cell_size + self.line_width)
is_rusinov@26: self.offset_y = (event.y - self.mouse_y) / (self.cell_size + self.line_width)
is_rusinov@18: self.mouse_x = event.x
is_rusinov@18: self.mouse_y = event.y
is_rusinov@18: self.draw()
is_rusinov@5:
is_rusinov@7: def press12(self, event):# zoom
is_rusinov@18: self.mouse_zoom = event.y
is_rusinov@5:
is_rusinov@7: def motion12(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 automata_frame(self):# show automata_frame
Ilia@9: automata_frame.pack(side="right", fill="y", expand="no", before=canvas)
is_rusinov@7:
is_rusinov@8: def to_top(self):# replace choosen state to top
is_rusinov@7: index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7: state = states[index]
is_rusinov@7: del states[index]
is_rusinov@7: states.insert(0, state)
is_rusinov@7:
is_rusinov@8: def to_bottom(self):# replace choosen state to botton
is_rusinov@7: index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7: state = states[index]
is_rusinov@7: del states[index]
is_rusinov@7: states.append(state)
is_rusinov@7:
is_rusinov@8: def upwards(self):
is_rusinov@7: index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7: state = states[index]
is_rusinov@7: del states[index]
is_rusinov@7: states.insert(index - 1, state)
is_rusinov@7:
is_rusinov@8: def downwards(self):
is_rusinov@7: index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7: state = states[index]
is_rusinov@7: del states[index]
is_rusinov@7: states.insert(index + 1, state)
is_rusinov@7:
is_rusinov@8: def delete_state(self):# delete choosen state
is_rusinov@7: index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7: del states[index]
is_rusinov@7:
is_rusinov@18: def add(self):# add new state
Ilia@2: pass
is_rusinov@5:
is_rusinov@18: def change(self):# change chosen state
Ilia@2: pass
is_rusinov@18: def show_size_window(self):
is_rusinov@18: size_window.deiconify()
is_rusinov@18: def hide_size_window(self):
is_rusinov@18: size_window.withdraw()
Ilia@6:
Ilia@6:
Ilia@6: root = Tk()
Ilia@6: root.title("Cyclyc Cell Automata")
Ilia@6:
Ilia@6: canvas = Canvas(root, background="white")
Ilia@6: canvas.config(width=500, height=400)
Ilia@6: canvas.pack(fill="both", expand="yes")
Ilia@6:
darkhan@25: automata = Automata(20, 20)
Ilia@6: handlers = Handlers(1, 1, 0, 0)
Ilia@6:
Ilia@6: states = []
Ilia@6: symboles = dict()
Ilia@6:
Ilia@6: #infoPanel=Frame
is_rusinov@18: automata_frame=Frame(root, background="grey")
Ilia@9:
Ilia@9: headline_frame=Frame(automata_frame, background="white")
Ilia@9: head = Label(headline_frame, text= "Automata Panel", font=16)
Ilia@9: head.pack(side="left", expand="yes")
Ilia@9: hide = Button(headline_frame, text="X", command=automata_frame.forget)
Ilia@9: hide.config(bg="grey")
Ilia@9: hide.pack(side="right")
Ilia@9: headline_frame.pack(side="top",fill="both", expand="no")
Ilia@9:
Ilia@9: Label(automata_frame, text= "State Box:").pack(side="top", fill="x")
Ilia@9: state_list=Listbox(automata_frame, selectmode="extended")
Ilia@6: for state in states:
is_rusinov@7: state_list.insert("end", state)
is_rusinov@7: state_list.pack(side="top", fill="y")
Ilia@19: up = Button(automata_frame, text="Up", state="disabled")
Ilia@6: up.config(bg="red")
Ilia@19: down = Button(automata_frame, text="Down", state="disabled")
Ilia@6: down.config(bg="orange")
Ilia@19: to_top = Button(automata_frame, text="To Top", state="disabled")
Ilia@6: to_top.config(bg="yellow")
Ilia@19: to_bottom = Button(automata_frame, text="To Bottom", state="disabled")
Ilia@6: to_bottom.config(bg="green")
Ilia@19: delete = Button(automata_frame, text="Delete", state="disabled")
Ilia@9: delete.config(bg="cyan")
Ilia@6: up.pack(side="top", fill="x")
Ilia@6: down.pack(side="top", fill="x")
Ilia@6: to_top.pack(side="top", fill="x")
Ilia@6: to_bottom.pack(side="top", fill="x")
Ilia@9: delete.pack(side="top", fill="x")
Ilia@6:
Ilia@6:
Ilia@9: information = Label(automata_frame, text= "Information of State")
Ilia@9: information.pack(side="top", fill="x")
Ilia@9: info_frame=Frame(automata_frame, background="white")
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@9: Label(info_frame, text="Color").grid(row=2, column=0)
Ilia@9: state_color = Entry(info_frame)
Ilia@9: state_color.grid(row=2, column=1)
Ilia@9: Label(info_frame, text="Key").grid(row=3, column=0)
Ilia@9: state_key = Entry(info_frame)
Ilia@9: state_key.grid(row=3, column=1)
Ilia@9: info_frame.pack(side="top")
Ilia@9:
Ilia@9:
Ilia@9: condition = Label(automata_frame, text= "Condition of conversion")
Ilia@9: condition.pack(side="top", fill="x")
Ilia@9: condition_frame=Frame(automata_frame, background="white")
Ilia@9: Label(condition_frame, text="0: ").grid(row=0, column=0)
Ilia@9: check_box_0 = Checkbutton(condition_frame)
Ilia@9: check_box_0.grid(row=0, column=1)
Ilia@9: Label(condition_frame, text="1: ").grid(row=0, column=2)
Ilia@9: check_box_1 = Checkbutton(condition_frame)
Ilia@9: check_box_1.grid(row=0, column=3)
Ilia@9: Label(condition_frame, text="2: ").grid(row=0, column=4)
Ilia@9: check_box_2 = Checkbutton(condition_frame)
Ilia@9: check_box_2.grid(row=0, column=5)
Ilia@9: Label(condition_frame, text="3: ").grid(row=1, column=0)
Ilia@9: check_box_0 = Checkbutton(condition_frame)
Ilia@9: check_box_0.grid(row=1, column=1)
Ilia@9: Label(condition_frame, text="4: ").grid(row=1, column=2)
Ilia@9: check_box_1 = Checkbutton(condition_frame)
Ilia@9: check_box_1.grid(row=1, column=3)
Ilia@9: Label(condition_frame, text="5: ").grid(row=1, column=4)
Ilia@9: check_box_2 = Checkbutton(condition_frame)
Ilia@9: check_box_2.grid(row=1, column=5)
Ilia@9: Label(condition_frame, text="6: ").grid(row=2, column=0)
Ilia@9: check_box_0 = Checkbutton(condition_frame)
Ilia@9: check_box_0.grid(row=2, column=1)
Ilia@9: Label(condition_frame, text="7: ").grid(row=2, column=2)
Ilia@9: check_box_1 = Checkbutton(condition_frame)
Ilia@9: check_box_1.grid(row=2, column=3)
Ilia@9: Label(condition_frame, text="8: ").grid(row=2, column=4)
Ilia@9: check_box_2 = Checkbutton(condition_frame)
Ilia@9: check_box_2.grid(row=2, column=5)
Ilia@9: condition_frame.pack(side="top")
Ilia@9:
Ilia@9:
Ilia@19: add_state = Button(automata_frame, text="ADD", state="disabled")
Ilia@9: add_state.config(bg="blue")
Ilia@19: change_state = Button(automata_frame, text="Change", state="disabled")
Ilia@9: change_state.config(bg="violet")
Ilia@9: add_state.pack(side="top", fill="x")
Ilia@9: change_state.pack(side="top", fill="x")
Ilia@9:
Ilia@9: error=Label(automata_frame)
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@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@12: apply_size = Button(apply_frame, text="Apply")
Ilia@12: apply_size.config(bg="yellow")
Ilia@12: apply_size.pack(side="left", fill="x")
Ilia@12: close_size = Button(apply_frame, text="Close", command=handlers.hide_size_window)
Ilia@12: close_size.config(bg="green")
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:
is_rusinov@7: menubar.add_command(label="Automata", command=handlers.automata_frame)
Ilia@6:
Ilia@12: menubar.add_command(label="Help", command=handlers.help)
Ilia@6:
Ilia@6: root.mainloop()
Ilia@6: