Документ взят из кэша поисковой машины. Адрес оригинального документа : http://kodomo.cmm.msu.su/trac/cca/browser/Interface.py?rev=14%3A9d820c8401c0&format=txt
Дата изменения: Sat Dec 4 22:03:10 2010
Дата индексирования: Fri Feb 11 11:01:12 2011
Кодировка:
from Tkinter import *

from State import *
from Automata import *


class Handlers(object):

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
self.cell_size = cell_size
self.line_width = line_width
self.delay = delay
self.offset_x = offset_x
self.offset_y = offset_y
self.after_id = 0
self.mouse_x = 0
self.mouse_y = 0
self.mouse_zoom = 0
self.zoom_divisor = 10
self.is_started = False
self.keys = dict()
def start(self):
if not self.is_started:
self.is_started = True
self.next_step()
self.after_id = canvas.after(self.delay, self.start)

def stop(self):
self.canvas.after_cancel(self.after_id)
self.is_started = False

def next_step(self):
automata.next_step()
self.draw()

def save_file():
pass

def open_file():
pass

def help():
pass

def close_help_window():
pass

def zoom_in(self, zoom_rate=1):
if self.cell_size < 50:
self.cell_size = self.cell_size + zoom_rate
self.draw()

def zoom_out(self, zoom_rate=1):
if self.cell_size > 1:
self.cell_size = self.cell_size - zoom_rate
self.draw()

def slower(self, speed_rate=1):
self.delay = self.delay + speed_rate

def faster(self, speed_rate=1):
if self.speed > speed_rate:
self.delay = self.delay - speed_rate
else:
self.delay = 0

def change_size(dx, dy, position=0):
if position < 9:
if position == 0 or position == 3 or position == 6:
automata.change_size(dx, 3)
elif position == 1 or position == 4 or position == 7:
automata.change_size(dx / 2, 3)
automata.change_size(dx - dx / 2, 1)
else:
automata.change_size(dx, 1)
if position == 0 or position == 1 or position == 2:
automata.change_size(dy, 0)
elif position == 3 or position == 4 or position == 5:
automata.change_size(dy / 2, 0)
automata.change_size(dy - dy / 2, 2)
else:
automata.change_size(dy, 2)
self.draw()

def draw():
pass

def press1(self, event):# drawer
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
automata.field[row][column] = automata.states[index].symbol
self.draw()

def motion1(self, event):# drawer
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
automata.field[row][column] = automata.states[index].symbol
self.draw()

def press3(self, event):# drawer
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
automata.field[row][column] = automata.states[index].symbol
self.draw()

def motion3(self, event):# drawer
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
automata.field[row][column] = automata.states[index].symbol
self.draw()

def press1_key(self, event):# drawer
if keys.has_key(event.char):
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
automata.field[row][column] = automata.states[keys[event.char]].symbol
self.draw()

def motion1_key(self, event):# drawer
if keys.has_key(event.char):
column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
automata.field[row][column] = automata.states[keys[event.char]].symbol
self.draw()

def press1_ctrl(self, event):# change_scale (B1+ctrl)
self.mouse_x = event.x
self.mouse_y = event.y

def motion1_ctrl(self, event):# change_scale (B1+ctrl)
self.offset_x = event.x - self.mouse_x
self.offset_y = event.y - self.mouse_y
self.mouse_x = event.x
self.mouse_y = event.y
self.draw()

def press12(self, event):# zoom
self.mouse_zoom = event.y

def motion12(self, event):# zoom
delta = (event.y - self.mouse_zoom) / self.zoom_divisor
self.cell_size = self.cell_size + delta
if self.cell_size > 50:
self.cell_size = 50
if self.cell_size < 1:
self.cell_size = 1
self.mouse_zoom = event.y
self.draw()

def automata_frame(self):# show automata_frame
frame1.pack(side="right", fill="y", expand="no", before=canvas)

def to_top(self):# replace choosen state to top
index = symbols.get(state_list.get("active").split()[1])
state = states[index]
del states[index]
states.insert(0, state)

def to_bottom(self):# replace choosen state to botton
index = symbols.get(state_list.get("active").split()[1])
state = states[index]
del states[index]
states.append(state)

def upwards(self):
index = symbols.get(state_list.get("active").split()[1])
state = states[index]
del states[index]
states.insert(index - 1, state)

def downwards(self):
index = symbols.get(state_list.get("active").split()[1])
state = states[index]
del states[index]
states.insert(index + 1, state)

def delete_state(self):# delete choosen state
index = symbols.get(state_list.get("active").split()[1])
del states[index]

def add():# add new state
pass

def change():# change chosen state
pass
def show_size_window(self):
size_window.deiconify()
def hide_size_window(self):
size_window.withdraw()


root = Tk()
root.title("Cyclyc Cell Automata")

canvas = Canvas(root, background="white")
canvas.config(width=500, height=400)
canvas.pack(fill="both", expand="yes")

automata = Automata()
handlers = Handlers(1, 1, 0, 0)

states = []
symboles = dict()

#infoPanel=Frame
frame1=Frame(root, background="grey")
state_list=Listbox(frame1, selectmode="extended")
for state in states:
state_list.insert("end", state)
state_list.pack(side="top", fill="y")
up = Button(frame1, text="Up", state="disable")
up.config(bg="red")
down = Button(frame1, text="Down", state="disable")
down.config(bg="orange")
to_top = Button(frame1, text="To Top", state="disable")
to_top.config(bg="yellow")
to_bottom = Button(frame1, text="To Bottom", state="disable")
to_bottom.config(bg="green")
hide = Button(frame1, text="hide", command=frame1.forget)
hide.config(bg="cyan")
up.pack(side="top", fill="x")
down.pack(side="top", fill="x")
to_top.pack(side="top", fill="x")
to_bottom.pack(side="top", fill="x")
hide.pack(side="bottom", fill="x")


menubar = Menu(root)
root.config(menu=menubar)

menu_file = Menu(menubar)
menu_file.add_command(label="New")
menu_file.add_command(label="Open...")
menu_file.add_command(label="Save...")
menu_file.add_separator()
menu_file.add_command(label="Exit")
menubar.add_cascade(label="File", menu=menu_file)

menu_action = Menu(menubar)
menu_action.add_command(label="Start")
menu_action.add_command(label="Stop")
menu_action.add_command(label="Next Step")
menu_action.add_command(label="Increase speed")
menu_action.add_command(label="Decrease speed")
menu_action.add_command(label="Zoom In")
menu_action.add_command(label="Zoom Out")
menu_action.add_command(label="Clean field")
menu_action.add_command(label="Fill randomly")
menubar.add_cascade(label="Action", menu=menu_action)

menubar.add_command(label="Automata", command=handlers.automata_frame)

menubar.add_command(label="Help")

root.mainloop()