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
|