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

cca

annotate Interface.py @ 14:9d820c8401c0

+ mouse handlers
author is_rusinov
date Sat, 04 Dec 2010 22:03:10 +0300
parents cda6324b8518
children b9d58d90c534
rev   line source
Ilia@6 1 from Tkinter import *
Ilia@2 2
is_rusinov@14 3 from State import *
is_rusinov@14 4 from Automata import *
is_rusinov@14 5
is_rusinov@14 6
Ilia@2 7 class Handlers(object):
is_rusinov@5 8
is_rusinov@14 9 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 10 self.cell_size = cell_size
is_rusinov@14 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@14 16 self.mouse_x = 0
is_rusinov@14 17 self.mouse_y = 0
is_rusinov@14 18 self.mouse_zoom = 0
is_rusinov@14 19 self.zoom_divisor = 10
is_rusinov@7 20 self.is_started = False
is_rusinov@14 21 self.keys = dict()
is_rusinov@5 22 def start(self):
is_rusinov@8 23 if not self.is_started:
is_rusinov@7 24 self.is_started = True
is_rusinov@7 25 self.next_step()
is_rusinov@7 26 self.after_id = canvas.after(self.delay, self.start)
is_rusinov@5 27
is_rusinov@5 28 def stop(self):
is_rusinov@5 29 self.canvas.after_cancel(self.after_id)
is_rusinov@7 30 self.is_started = False
is_rusinov@5 31
is_rusinov@5 32 def next_step(self):
is_rusinov@7 33 automata.next_step()
is_rusinov@5 34 self.draw()
is_rusinov@5 35
is_rusinov@5 36 def save_file():
Ilia@2 37 pass
is_rusinov@5 38
is_rusinov@5 39 def open_file():
Ilia@2 40 pass
is_rusinov@5 41
Ilia@2 42 def help():
Ilia@2 43 pass
is_rusinov@5 44
is_rusinov@14 45 def close_help_window():
is_rusinov@8 46 pass
is_rusinov@8 47
is_rusinov@8 48 def zoom_in(self, zoom_rate=1):
is_rusinov@7 49 if self.cell_size < 50:
is_rusinov@8 50 self.cell_size = self.cell_size + zoom_rate
is_rusinov@7 51 self.draw()
is_rusinov@5 52
is_rusinov@8 53 def zoom_out(self, zoom_rate=1):
is_rusinov@7 54 if self.cell_size > 1:
is_rusinov@8 55 self.cell_size = self.cell_size - zoom_rate
is_rusinov@7 56 self.draw()
is_rusinov@5 57
is_rusinov@8 58 def slower(self, speed_rate=1):
is_rusinov@7 59 self.delay = self.delay + speed_rate
is_rusinov@5 60
is_rusinov@8 61 def faster(self, speed_rate=1):
is_rusinov@7 62 if self.speed > speed_rate:
is_rusinov@7 63 self.delay = self.delay - speed_rate
is_rusinov@7 64 else:
is_rusinov@7 65 self.delay = 0
is_rusinov@5 66
is_rusinov@8 67 def change_size(dx, dy, position=0):
is_rusinov@8 68 if position < 9:
is_rusinov@8 69 if position == 0 or position == 3 or position == 6:
is_rusinov@8 70 automata.change_size(dx, 3)
is_rusinov@8 71 elif position == 1 or position == 4 or position == 7:
is_rusinov@8 72 automata.change_size(dx / 2, 3)
is_rusinov@8 73 automata.change_size(dx - dx / 2, 1)
is_rusinov@14 74 else:
is_rusinov@8 75 automata.change_size(dx, 1)
is_rusinov@8 76 if position == 0 or position == 1 or position == 2:
is_rusinov@8 77 automata.change_size(dy, 0)
is_rusinov@8 78 elif position == 3 or position == 4 or position == 5:
is_rusinov@8 79 automata.change_size(dy / 2, 0)
is_rusinov@8 80 automata.change_size(dy - dy / 2, 2)
is_rusinov@14 81 else:
is_rusinov@8 82 automata.change_size(dy, 2)
is_rusinov@8 83 self.draw()
is_rusinov@5 84
Ilia@2 85 def draw():
Ilia@2 86 pass
is_rusinov@5 87
is_rusinov@7 88 def press1(self, event):# drawer
is_rusinov@14 89 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 90 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 91 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
is_rusinov@14 92 automata.field[row][column] = automata.states[index].symbol
is_rusinov@14 93 self.draw()
is_rusinov@5 94
is_rusinov@7 95 def motion1(self, event):# drawer
is_rusinov@14 96 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 97 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 98 index = (automata.symbols[automata.field[row][column]] + 1) % len(automata.states)
is_rusinov@14 99 automata.field[row][column] = automata.states[index].symbol
is_rusinov@14 100 self.draw()
is_rusinov@5 101
is_rusinov@7 102 def press3(self, event):# drawer
is_rusinov@14 103 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 104 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 105 index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
is_rusinov@14 106 automata.field[row][column] = automata.states[index].symbol
is_rusinov@14 107 self.draw()
is_rusinov@5 108
is_rusinov@7 109 def motion3(self, event):# drawer
is_rusinov@14 110 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 111 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 112 index = (automata.symbols[automata.field[row][column]] + len(automata.states) - 1) % len(automata.states)
is_rusinov@14 113 automata.field[row][column] = automata.states[index].symbol
is_rusinov@14 114 self.draw()
is_rusinov@5 115
is_rusinov@14 116 def press1_key(self, event):# drawer
is_rusinov@14 117 if keys.has_key(event.char):
is_rusinov@14 118 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 119 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 120 automata.field[row][column] = automata.states[keys[event.char]].symbol
is_rusinov@14 121 self.draw()
is_rusinov@5 122
is_rusinov@14 123 def motion1_key(self, event):# drawer
is_rusinov@14 124 if keys.has_key(event.char):
is_rusinov@14 125 column = (event.x - self.offset_x) / (self.cell_size + self.line_width)
is_rusinov@14 126 row = (event.y - self.offset_y) / (self.cell_size + self.line_width)
is_rusinov@14 127 automata.field[row][column] = automata.states[keys[event.char]].symbol
is_rusinov@14 128 self.draw()
is_rusinov@14 129
is_rusinov@14 130 def press1_ctrl(self, event):# change_scale (B1+ctrl)
is_rusinov@14 131 self.mouse_x = event.x
is_rusinov@14 132 self.mouse_y = event.y
is_rusinov@14 133
is_rusinov@14 134 def motion1_ctrl(self, event):# change_scale (B1+ctrl)
is_rusinov@14 135 self.offset_x = event.x - self.mouse_x
is_rusinov@14 136 self.offset_y = event.y - self.mouse_y
is_rusinov@14 137 self.mouse_x = event.x
is_rusinov@14 138 self.mouse_y = event.y
is_rusinov@14 139 self.draw()
is_rusinov@5 140
is_rusinov@7 141 def press12(self, event):# zoom
is_rusinov@14 142 self.mouse_zoom = event.y
is_rusinov@5 143
is_rusinov@7 144 def motion12(self, event):# zoom
is_rusinov@14 145 delta = (event.y - self.mouse_zoom) / self.zoom_divisor
is_rusinov@14 146 self.cell_size = self.cell_size + delta
is_rusinov@14 147 if self.cell_size > 50:
is_rusinov@14 148 self.cell_size = 50
is_rusinov@14 149 if self.cell_size < 1:
is_rusinov@14 150 self.cell_size = 1
is_rusinov@14 151 self.mouse_zoom = event.y
is_rusinov@14 152 self.draw()
is_rusinov@5 153
is_rusinov@8 154 def automata_frame(self):# show automata_frame
is_rusinov@7 155 frame1.pack(side="right", fill="y", expand="no", before=canvas)
is_rusinov@7 156
is_rusinov@8 157 def to_top(self):# replace choosen state to top
is_rusinov@7 158 index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7 159 state = states[index]
is_rusinov@7 160 del states[index]
is_rusinov@7 161 states.insert(0, state)
is_rusinov@7 162
is_rusinov@8 163 def to_bottom(self):# replace choosen state to botton
is_rusinov@7 164 index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7 165 state = states[index]
is_rusinov@7 166 del states[index]
is_rusinov@7 167 states.append(state)
is_rusinov@7 168
is_rusinov@8 169 def upwards(self):
is_rusinov@7 170 index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7 171 state = states[index]
is_rusinov@7 172 del states[index]
is_rusinov@7 173 states.insert(index - 1, state)
is_rusinov@7 174
is_rusinov@8 175 def downwards(self):
is_rusinov@7 176 index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7 177 state = states[index]
is_rusinov@7 178 del states[index]
is_rusinov@7 179 states.insert(index + 1, state)
is_rusinov@7 180
is_rusinov@8 181 def delete_state(self):# delete choosen state
is_rusinov@7 182 index = symbols.get(state_list.get("active").split()[1])
is_rusinov@7 183 del states[index]
is_rusinov@7 184
is_rusinov@7 185 def add():# add new state
Ilia@2 186 pass
is_rusinov@5 187
is_rusinov@7 188 def change():# change chosen state
Ilia@2 189 pass
is_rusinov@14 190 def show_size_window(self):
is_rusinov@14 191 size_window.deiconify()
is_rusinov@14 192 def hide_size_window(self):
is_rusinov@14 193 size_window.withdraw()
Ilia@6 194
Ilia@6 195
Ilia@6 196 root = Tk()
Ilia@6 197 root.title("Cyclyc Cell Automata")
Ilia@6 198
Ilia@6 199 canvas = Canvas(root, background="white")
Ilia@6 200 canvas.config(width=500, height=400)
Ilia@6 201 canvas.pack(fill="both", expand="yes")
Ilia@6 202
Ilia@6 203 automata = Automata()
Ilia@6 204 handlers = Handlers(1, 1, 0, 0)
Ilia@6 205
Ilia@6 206 states = []
Ilia@6 207 symboles = dict()
Ilia@6 208
Ilia@6 209 #infoPanel=Frame
Ilia@6 210 frame1=Frame(root, background="grey")
is_rusinov@7 211 state_list=Listbox(frame1, selectmode="extended")
Ilia@6 212 for state in states:
is_rusinov@7 213 state_list.insert("end", state)
is_rusinov@7 214 state_list.pack(side="top", fill="y")
Ilia@6 215 up = Button(frame1, text="Up", state="disable")
Ilia@6 216 up.config(bg="red")
Ilia@6 217 down = Button(frame1, text="Down", state="disable")
Ilia@6 218 down.config(bg="orange")
Ilia@6 219 to_top = Button(frame1, text="To Top", state="disable")
Ilia@6 220 to_top.config(bg="yellow")
Ilia@6 221 to_bottom = Button(frame1, text="To Bottom", state="disable")
Ilia@6 222 to_bottom.config(bg="green")
Ilia@6 223 hide = Button(frame1, text="hide", command=frame1.forget)
Ilia@6 224 hide.config(bg="cyan")
Ilia@6 225 up.pack(side="top", fill="x")
Ilia@6 226 down.pack(side="top", fill="x")
Ilia@6 227 to_top.pack(side="top", fill="x")
Ilia@6 228 to_bottom.pack(side="top", fill="x")
Ilia@6 229 hide.pack(side="bottom", fill="x")
Ilia@6 230
Ilia@6 231
Ilia@6 232 menubar = Menu(root)
Ilia@6 233 root.config(menu=menubar)
Ilia@6 234
Ilia@6 235 menu_file = Menu(menubar)
Ilia@6 236 menu_file.add_command(label="New")
Ilia@6 237 menu_file.add_command(label="Open...")
Ilia@6 238 menu_file.add_command(label="Save...")
Ilia@6 239 menu_file.add_separator()
Ilia@6 240 menu_file.add_command(label="Exit")
Ilia@6 241 menubar.add_cascade(label="File", menu=menu_file)
Ilia@6 242
Ilia@6 243 menu_action = Menu(menubar)
Ilia@6 244 menu_action.add_command(label="Start")
Ilia@6 245 menu_action.add_command(label="Stop")
Ilia@6 246 menu_action.add_command(label="Next Step")
Ilia@6 247 menu_action.add_command(label="Increase speed")
Ilia@6 248 menu_action.add_command(label="Decrease speed")
Ilia@6 249 menu_action.add_command(label="Zoom In")
Ilia@6 250 menu_action.add_command(label="Zoom Out")
Ilia@6 251 menu_action.add_command(label="Clean field")
Ilia@6 252 menu_action.add_command(label="Fill randomly")
Ilia@6 253 menubar.add_cascade(label="Action", menu=menu_action)
Ilia@6 254
is_rusinov@7 255 menubar.add_command(label="Automata", command=handlers.automata_frame)
Ilia@6 256
Ilia@6 257 menubar.add_command(label="Help")
Ilia@6 258
Ilia@6 259 root.mainloop()
Ilia@6 260