rev |
line source |
Ilia@6
|
1 from Tkinter import * |
Ilia@2
|
2 |
Ilia@2
|
3 class Handlers(object): |
is_rusinov@5
|
4 |
is_rusinov@8
|
5 def __init__(self, cell_size=5, delay=10, offset_x=0, offset_y=0):# cell_size is size of cell, including line width, if there is it |
is_rusinov@7
|
6 self.cell_size = cell_size |
is_rusinov@7
|
7 self.delay = delay |
Ilia@6
|
8 self.offset_x = offset_x |
Ilia@6
|
9 self.offset_y = offset_y |
is_rusinov@5
|
10 self.after_id = 0 |
is_rusinov@7
|
11 self.is_started = False |
is_rusinov@5
|
12 |
is_rusinov@5
|
13 def start(self): |
is_rusinov@8
|
14 if not self.is_started: |
is_rusinov@7
|
15 self.is_started = True |
is_rusinov@7
|
16 self.next_step() |
is_rusinov@7
|
17 self.after_id = canvas.after(self.delay, self.start) |
is_rusinov@5
|
18 |
is_rusinov@5
|
19 def stop(self): |
is_rusinov@5
|
20 self.canvas.after_cancel(self.after_id) |
is_rusinov@7
|
21 self.is_started = False |
is_rusinov@5
|
22 |
is_rusinov@5
|
23 def next_step(self): |
is_rusinov@7
|
24 automata.next_step() |
is_rusinov@5
|
25 self.draw() |
is_rusinov@5
|
26 |
is_rusinov@5
|
27 def save_file(): |
Ilia@2
|
28 pass |
is_rusinov@5
|
29 |
is_rusinov@5
|
30 def open_file(): |
Ilia@2
|
31 pass |
is_rusinov@5
|
32 |
Ilia@2
|
33 def help(): |
Ilia@2
|
34 pass |
is_rusinov@5
|
35 |
is_rusinov@5
|
36 def close_help_window |
is_rusinov@8
|
37 pass |
is_rusinov@8
|
38 |
is_rusinov@8
|
39 def zoom_in(self, zoom_rate=1): |
is_rusinov@7
|
40 if self.cell_size < 50: |
is_rusinov@8
|
41 self.cell_size = self.cell_size + zoom_rate |
is_rusinov@7
|
42 self.draw() |
is_rusinov@5
|
43 |
is_rusinov@8
|
44 def zoom_out(self, zoom_rate=1): |
is_rusinov@7
|
45 if self.cell_size > 1: |
is_rusinov@8
|
46 self.cell_size = self.cell_size - zoom_rate |
is_rusinov@7
|
47 self.draw() |
is_rusinov@5
|
48 |
is_rusinov@8
|
49 def slower(self, speed_rate=1): |
is_rusinov@7
|
50 self.delay = self.delay + speed_rate |
is_rusinov@5
|
51 |
is_rusinov@8
|
52 def faster(self, speed_rate=1): |
is_rusinov@7
|
53 if self.speed > speed_rate: |
is_rusinov@7
|
54 self.delay = self.delay - speed_rate |
is_rusinov@7
|
55 else: |
is_rusinov@7
|
56 self.delay = 0 |
is_rusinov@5
|
57 |
is_rusinov@8
|
58 def change_size(dx, dy, position=0): |
is_rusinov@8
|
59 if position < 9: |
is_rusinov@8
|
60 if position == 0 or position == 3 or position == 6: |
is_rusinov@8
|
61 automata.change_size(dx, 3) |
is_rusinov@8
|
62 elif position == 1 or position == 4 or position == 7: |
is_rusinov@8
|
63 automata.change_size(dx / 2, 3) |
is_rusinov@8
|
64 automata.change_size(dx - dx / 2, 1) |
is_rusinov@8
|
65 else |
is_rusinov@8
|
66 automata.change_size(dx, 1) |
is_rusinov@8
|
67 if position == 0 or position == 1 or position == 2: |
is_rusinov@8
|
68 automata.change_size(dy, 0) |
is_rusinov@8
|
69 elif position == 3 or position == 4 or position == 5: |
is_rusinov@8
|
70 automata.change_size(dy / 2, 0) |
is_rusinov@8
|
71 automata.change_size(dy - dy / 2, 2) |
is_rusinov@8
|
72 else |
is_rusinov@8
|
73 automata.change_size(dy, 2) |
is_rusinov@8
|
74 self.draw() |
is_rusinov@5
|
75 |
Ilia@2
|
76 def draw(): |
Ilia@2
|
77 pass |
is_rusinov@5
|
78 |
is_rusinov@7
|
79 def press1(self, event):# drawer |
Ilia@2
|
80 pass |
is_rusinov@5
|
81 |
is_rusinov@7
|
82 def motion1(self, event):# drawer |
Ilia@2
|
83 pass |
is_rusinov@5
|
84 |
is_rusinov@7
|
85 def press3(self, event):# drawer |
Ilia@2
|
86 pass |
is_rusinov@5
|
87 |
is_rusinov@7
|
88 def motion3(self, event):# drawer |
Ilia@2
|
89 pass |
is_rusinov@5
|
90 |
is_rusinov@7
|
91 def press_key1(self, event):# drawer+change_scale (B1+ctrl) |
Ilia@2
|
92 pass |
is_rusinov@5
|
93 |
is_rusinov@7
|
94 def motion_key1(self, event):# drawer+change_scale (B1+ctrl) |
Ilia@2
|
95 pass |
is_rusinov@5
|
96 |
is_rusinov@7
|
97 def press12(self, event):# zoom |
Ilia@2
|
98 pass |
is_rusinov@5
|
99 |
is_rusinov@7
|
100 def motion12(self, event):# zoom |
Ilia@2
|
101 pass |
is_rusinov@5
|
102 |
is_rusinov@8
|
103 def automata_frame(self):# show automata_frame |
Ilia@9
|
104 automata_frame.pack(side="right", fill="y", expand="no", before=canvas) |
is_rusinov@7
|
105 |
is_rusinov@8
|
106 def to_top(self):# replace choosen state to top |
is_rusinov@7
|
107 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
108 state = states[index] |
is_rusinov@7
|
109 del states[index] |
is_rusinov@7
|
110 states.insert(0, state) |
is_rusinov@7
|
111 |
is_rusinov@8
|
112 def to_bottom(self):# replace choosen state to botton |
is_rusinov@7
|
113 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
114 state = states[index] |
is_rusinov@7
|
115 del states[index] |
is_rusinov@7
|
116 states.append(state) |
is_rusinov@7
|
117 |
is_rusinov@8
|
118 def upwards(self): |
is_rusinov@7
|
119 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
120 state = states[index] |
is_rusinov@7
|
121 del states[index] |
is_rusinov@7
|
122 states.insert(index - 1, state) |
is_rusinov@7
|
123 |
is_rusinov@8
|
124 def downwards(self): |
is_rusinov@7
|
125 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
126 state = states[index] |
is_rusinov@7
|
127 del states[index] |
is_rusinov@7
|
128 states.insert(index + 1, state) |
is_rusinov@7
|
129 |
is_rusinov@8
|
130 def delete_state(self):# delete choosen state |
is_rusinov@7
|
131 index = symbols.get(state_list.get("active").split()[1]) |
is_rusinov@7
|
132 del states[index] |
is_rusinov@7
|
133 |
is_rusinov@7
|
134 def add():# add new state |
Ilia@2
|
135 pass |
is_rusinov@5
|
136 |
is_rusinov@7
|
137 def change():# change chosen state |
Ilia@2
|
138 pass |
is_rusinov@5
|
139 |
Ilia@6
|
140 |
Ilia@6
|
141 |
Ilia@6
|
142 root = Tk() |
Ilia@6
|
143 root.title("Cyclyc Cell Automata") |
Ilia@6
|
144 |
Ilia@6
|
145 canvas = Canvas(root, background="white") |
Ilia@6
|
146 canvas.config(width=500, height=400) |
Ilia@6
|
147 canvas.pack(fill="both", expand="yes") |
Ilia@6
|
148 |
Ilia@6
|
149 automata = Automata() |
Ilia@6
|
150 handlers = Handlers(1, 1, 0, 0) |
Ilia@6
|
151 |
Ilia@6
|
152 states = [] |
Ilia@6
|
153 symboles = dict() |
Ilia@6
|
154 |
Ilia@6
|
155 #infoPanel=Frame |
Ilia@9
|
156 automata_frame=Frame(root, background="grey") |
Ilia@9
|
157 |
Ilia@9
|
158 headline_frame=Frame(automata_frame, background="white") |
Ilia@9
|
159 head = Label(headline_frame, text= "Automata Panel", font=16) |
Ilia@9
|
160 head.pack(side="left", expand="yes") |
Ilia@9
|
161 hide = Button(headline_frame, text="X", command=automata_frame.forget) |
Ilia@9
|
162 hide.config(bg="grey") |
Ilia@9
|
163 hide.pack(side="right") |
Ilia@9
|
164 headline_frame.pack(side="top",fill="both", expand="no") |
Ilia@9
|
165 |
Ilia@9
|
166 Label(automata_frame, text= "State Box:").pack(side="top", fill="x") |
Ilia@9
|
167 statelist=Listbox(automata_frame, selectmode = "extended") |
Ilia@9
|
168 state_list=Listbox(automata_frame, selectmode="extended") |
Ilia@6
|
169 for state in states: |
is_rusinov@7
|
170 state_list.insert("end", state) |
is_rusinov@7
|
171 state_list.pack(side="top", fill="y") |
Ilia@9
|
172 up = Button(automata_frame, text="Up", state="DISABLED") |
Ilia@6
|
173 up.config(bg="red") |
Ilia@9
|
174 down = Button(automata_frame, text="Down", state="DISABLED") |
Ilia@6
|
175 down.config(bg="orange") |
Ilia@9
|
176 to_top = Button(automata_frame, text="To Top", state="DISABLED") |
Ilia@6
|
177 to_top.config(bg="yellow") |
Ilia@9
|
178 to_bottom = Button(automata_frame, text="To Bottom", state="DISABLED") |
Ilia@6
|
179 to_bottom.config(bg="green") |
Ilia@9
|
180 delete = Button(automata_frame, text="Delete", command=callback, state="disabled") |
Ilia@9
|
181 delete.config(bg="cyan") |
Ilia@6
|
182 up.pack(side="top", fill="x") |
Ilia@6
|
183 down.pack(side="top", fill="x") |
Ilia@6
|
184 to_top.pack(side="top", fill="x") |
Ilia@6
|
185 to_bottom.pack(side="top", fill="x") |
Ilia@9
|
186 delete.pack(side="top", fill="x") |
Ilia@9
|
187 |
Ilia@9
|
188 |
Ilia@9
|
189 information = Label(automata_frame, text= "Information of State") |
Ilia@9
|
190 information.pack(side="top", fill="x") |
Ilia@9
|
191 info_frame=Frame(automata_frame, background="white") |
Ilia@9
|
192 Label(info_frame, text="Name").grid(row=0, column=0) |
Ilia@9
|
193 state_name = Entry(info_frame) |
Ilia@9
|
194 state_name.grid(row=0, column=1) |
Ilia@9
|
195 Label(info_frame, text="Symbol").grid(row=1, column=0) |
Ilia@9
|
196 state_symbol = Entry(info_frame) |
Ilia@9
|
197 state_symbol.grid(row=1, column=1) |
Ilia@9
|
198 Label(info_frame, text="Color").grid(row=2, column=0) |
Ilia@9
|
199 state_color = Entry(info_frame) |
Ilia@9
|
200 state_color.grid(row=2, column=1) |
Ilia@9
|
201 Label(info_frame, text="Key").grid(row=3, column=0) |
Ilia@9
|
202 state_key = Entry(info_frame) |
Ilia@9
|
203 state_key.grid(row=3, column=1) |
Ilia@9
|
204 info_frame.pack(side="top") |
Ilia@9
|
205 |
Ilia@9
|
206 |
Ilia@9
|
207 condition = Label(automata_frame, text= "Condition of conversion") |
Ilia@9
|
208 condition.pack(side="top", fill="x") |
Ilia@9
|
209 condition_frame=Frame(automata_frame, background="white") |
Ilia@9
|
210 Label(condition_frame, text="0: ").grid(row=0, column=0) |
Ilia@9
|
211 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
212 check_box_0.grid(row=0, column=1) |
Ilia@9
|
213 Label(condition_frame, text="1: ").grid(row=0, column=2) |
Ilia@9
|
214 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
215 check_box_1.grid(row=0, column=3) |
Ilia@9
|
216 Label(condition_frame, text="2: ").grid(row=0, column=4) |
Ilia@9
|
217 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
218 check_box_2.grid(row=0, column=5) |
Ilia@9
|
219 Label(condition_frame, text="3: ").grid(row=1, column=0) |
Ilia@9
|
220 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
221 check_box_0.grid(row=1, column=1) |
Ilia@9
|
222 Label(condition_frame, text="4: ").grid(row=1, column=2) |
Ilia@9
|
223 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
224 check_box_1.grid(row=1, column=3) |
Ilia@9
|
225 Label(condition_frame, text="5: ").grid(row=1, column=4) |
Ilia@9
|
226 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
227 check_box_2.grid(row=1, column=5) |
Ilia@9
|
228 Label(condition_frame, text="6: ").grid(row=2, column=0) |
Ilia@9
|
229 check_box_0 = Checkbutton(condition_frame) |
Ilia@9
|
230 check_box_0.grid(row=2, column=1) |
Ilia@9
|
231 Label(condition_frame, text="7: ").grid(row=2, column=2) |
Ilia@9
|
232 check_box_1 = Checkbutton(condition_frame) |
Ilia@9
|
233 check_box_1.grid(row=2, column=3) |
Ilia@9
|
234 Label(condition_frame, text="8: ").grid(row=2, column=4) |
Ilia@9
|
235 check_box_2 = Checkbutton(condition_frame) |
Ilia@9
|
236 check_box_2.grid(row=2, column=5) |
Ilia@9
|
237 condition_frame.pack(side="top") |
Ilia@9
|
238 |
Ilia@9
|
239 |
Ilia@9
|
240 add_state = Button(automata_frame, text="ADD", command=callback, state="disabled") |
Ilia@9
|
241 add_state.config(bg="blue") |
Ilia@9
|
242 change_state = Button(automata_frame, text="Change", command=callback, state="disabled") |
Ilia@9
|
243 change_state.config(bg="violet") |
Ilia@9
|
244 add_state.pack(side="top", fill="x") |
Ilia@9
|
245 change_state.pack(side="top", fill="x") |
Ilia@9
|
246 |
Ilia@9
|
247 error=Label(automata_frame) |
Ilia@9
|
248 error.pack(side="top", fill="x") |
Ilia@6
|
249 |
Ilia@6
|
250 |
Ilia@6
|
251 menubar = Menu(root) |
Ilia@6
|
252 root.config(menu=menubar) |
Ilia@6
|
253 |
Ilia@6
|
254 menu_file = Menu(menubar) |
Ilia@6
|
255 menu_file.add_command(label="New") |
Ilia@9
|
256 menu_file.add_command(label="Open...", command=handlers.open_file) |
Ilia@9
|
257 menu_file.add_command(label="Save...", command=handlers.save_file) |
Ilia@6
|
258 menu_file.add_separator() |
Ilia@9
|
259 menu_file.add_command(label="Exit", command=root.destroy) |
Ilia@6
|
260 menubar.add_cascade(label="File", menu=menu_file) |
Ilia@6
|
261 |
Ilia@6
|
262 menu_action = Menu(menubar) |
Ilia@9
|
263 menu_action.add_command(label="Start", command=handlers.start) |
Ilia@9
|
264 menu_action.add_command(label="Stop", command=handlers.stop) |
Ilia@9
|
265 menu_action.add_command(label="Next Step", command=handlers.next_step) |
Ilia@9
|
266 menu_action.add_command(label="Increase speed", command=handlers.faster) |
Ilia@9
|
267 menu_action.add_command(label="Decrease speed", command=handlers.slower) |
Ilia@9
|
268 menu_action.add_command(label="Zoom In", command=handlers.zoom_in) |
Ilia@9
|
269 menu_action.add_command(label="Zoom Out", command=handlers.zoom_out) |
Ilia@6
|
270 menu_action.add_command(label="Clean field") |
Ilia@6
|
271 menu_action.add_command(label="Fill randomly") |
Ilia@6
|
272 menubar.add_cascade(label="Action", menu=menu_action) |
Ilia@6
|
273 |
is_rusinov@7
|
274 menubar.add_command(label="Automata", command=handlers.automata_frame) |
Ilia@6
|
275 |
Ilia@6
|
276 menubar.add_command(label="Help") |
Ilia@6
|
277 |
Ilia@6
|
278 root.mainloop() |
Ilia@6
|
279
|