Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : http://kodomo.cmm.msu.su/trac/cca/browser/Interface.py?rev=69
Äàòà èçìåíåíèÿ: Unknown
Äàòà èíäåêñèðîâàíèÿ: Sun Apr 10 21:06:21 2016
Êîäèðîâêà: UTF-8
Interface.py ? Cyclyc Cell Automata

source: Interface.py @ 69:ac96d7c2c7c4

Revision 69:ac96d7c2c7c4, 22.4 KB checked in by is_rusinov, 5 years ago (diff)

+ clean_field and random_fill (fix #13); correct critical mistake with changing of dicts while state_list changes

  • Property exe set to *
Lineš
1importšmath
2importšrandom
3importštkColorChooser
4fromšTkinteršimportš*
5
6fromšStatešimportš*
7fromšAutomatašimportš*
8
9
10classšHandlers(object):
11š š š š
12š š š š defš__init__(self,šcell_size=8,šline_width=1š,delay=10,šoffset_x=0,šoffset_y=0):# cell_size is size of cell, including line width, if there is it
13š š š š š š š š self.cell_size =šcell_size
14š š š š š š š š self.line_width =šline_width
15š š š š š š š š self.delay =šdelay
16š š š š š š š š self.offset_x =šoffset_x
17š š š š š š š š self.offset_y =šoffset_y
18š š š š š š š š self.after_id =š0
19š š š š š š š š self.mouse_offset_x =š0
20š š š š š š š š self.mouse_offset_y =š0
21š š š š š š š š self.mouse_zoom =š0
22š š š š š š š š self.zoom_divisor =š1
23š š š š š š š š self.selected_state =šNone
24š š š š š š š š self.is_started =šFalse
25š š š š š š š š self.char =šNone
26š š š š š š š š self.keys =šdict()
27š š š š š š š š self.draw()
28š š š š defšstart(self):
29š š š š š š š š ifšnotšself.is_started:
30š š š š š š š š š š š š self.is_started =šTrue
31š š š š š š š š š š š š self.repeat()
32š š š š defšrepeat(self):
33š š š š š š š š self.next_step()
34š š š š š š š š self.after_id =šcanvas.after(self.delay,šself.repeat)
35š š š š
36š š š š defšstop(self):
37š š š š š š š š canvas.after_cancel(self.after_id)
38š š š š š š š š self.is_started =šFalse
39š š š š
40š š š š defšnext_step(self):
41š š š š š š š š self.draw_cell(automata.next_step())
42š š š š
43š š š š defšsave_file(self):
44š š š š š š š š pass
45š š š š
46š š š š defšopen_file(self):
47š š š š š š š š pass
48š š š š
49š š š š defšshow_help_window(self):
50š š š š š š š š pass
51š š š š
52š š š š defšhide_help_window(self):
53š š š š š š š š pass
54š š š š
55š š š š defšzoom_in(self,šzoom_rate=1):
56š š š š š š š š ifšself.cell_size <š50:
57š š š š š š š š š š š š self.cell_size =šself.cell_size +šzoom_rate
58š š š š š š š š š š š š self.draw()
59š š š š
60š š š š defšzoom_out(self,šzoom_rate=1):
61š š š š š š š š ifšself.cell_size >š1:
62š š š š š š š š š š š š self.cell_size =šself.cell_size -šzoom_rate
63š š š š š š š š š š š š self.draw()
64š š š š
65š š š š defšslower(self,šspeed_rate=1):
66š š š š š š š š self.delay =šself.delay +šspeed_rate
67š š š š
68š š š š defšfaster(self,šspeed_rate=1):
69š š š š š š š š ifšself.delay >šspeed_rate:
70š š š š š š š š š š š š self.delay =šself.delay -šspeed_rate
71š š š š š š š š else:
72š š š š š š š š š š š š self.delay =š0
73š š š š
74š š š š defšchange_size(self,šdx,šdy,šposition=0):
75š š š š š š š š ifšposition <š9:
76š š š š š š š š š š š š ifšposition ==š0šoršposition ==š3šoršposition ==š6:
77š š š š š š š š š š š š š š š š automata.change_size(dx,š3)
78š š š š š š š š š š š š elifšposition ==š1šoršposition ==š4šoršposition ==š7:
79š š š š š š š š š š š š š š š š automata.change_size(dx /š2,š3)
80š š š š š š š š š š š š š š š š automata.change_size(dx -šdx /š2,š1)
81š š š š š š š š š š š š else:
82š š š š š š š š š š š š š š š š automata.change_size(dx,š1)
83š š š š š š š š š š š š ifšposition ==š0šoršposition ==š1šoršposition ==š2:
84š š š š š š š š š š š š š š š š automata.change_size(dy,š0)
85š š š š š š š š š š š š elifšposition ==š3šoršposition ==š4šoršposition ==š5:
86š š š š š š š š š š š š š š š š automata.change_size(dy /š2,š0)
87š š š š š š š š š š š š š š š š automata.change_size(dy -šdy /š2,š2)
88š š š š š š š š š š š š else:
89š š š š š š š š š š š š š š š š automata.change_size(dy,š2)
90š š š š š š š š š š š š self.draw()
91š š š š
92š š š š defšdraw_cell(self,šcells):
93š š š š š š š š foršrow,šcol inšcells:
94š š š š š š š š š š š š index =šautomata.symbols[automata.field[row][col]]
95š š š š š š š š š š š š color =šautomata.states[index].color
96š š š š š š š š š š š š canvas.itemconfig(self.cells[row][col],šfill=color)
97š š š š
98š š š š defšdraw(self):
99š š š š š š š š canvas.delete("all")
100š š š š š š š š self.cells =š[]
101š š š š š š š š
102š š š š š š š š shift =šself.cell_size +šself.line_width
103š š š š š š š š š š š š š š š š
104š š š š š š š š left =š-self.offset_x +šself.line_width
105š š š š š š š š top =š-self.offset_y +šself.line_width
106š š š š š š š š foršrow inšrange(automata.height):
107š š š š š š š š š š š š self.cells.append([])
108š š š š š š š š š š š š foršcol inšrange(automata.width):
109š š š š š š š š š š š š š š š š index =šautomata.symbols[automata.field[row][col]]
110š š š š š š š š š š š š š š š š color =šautomata.states[index].color
111š š š š š š š š š š š š š š š š cell =šcanvas.create_rectangle(left +šcol *šshift,
112š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š top +šrow *šshift,
113š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š left +šcol *šshift +šself.cell_size,
114š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š top +šrow *šshift +šself.cell_size,
115š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š š fill=color,šoutline="",štag="cell")
116š š š š š š š š š š š š š š š š self.cells[row].append(cell)
117š š š š
118š š š š defšdraw_line(self,šx1,šy1,šx2,šy2,šorder=1):
119š š š š š š š š answer =š[]
120š š š š š š š š ifšabs(x1 -šx2)š>šabs(y1 -šy2):
121š š š š š š š š š š š š dx =šx2 -šx1
122š š š š š š š š š š š š abs_dx =šabs(dx)
123š š š š š š š š š š š š dy =šfloat(y2 -šy1)
124š š š š š š š š š š š š whilešx1 !=šx2:
125š š š š š š š š š š š š š š š š x1 =šx1 +šdx /šabs_dx
126š š š š š š š š š š š š š š š š y1 =šy1 +šdy /šabs_dx
127š š š š š š š š š š š š š š š š answer.append((self.rounding(y1),šx1))
128š š š š š š š š else:
129š š š š š š š š š š š š dx =šfloat(x2 -šx1)
130š š š š š š š š š š š š dy =šy2 -šy1
131š š š š š š š š š š š š abs_dy =šabs(dy)
132š š š š š š š š š š š š whilešy1 !=šy2:
133š š š š š š š š š š š š š š š š x1 =šx1 +šdx /šabs_dy
134š š š š š š š š š š š š š š š š y1 =šy1 +šdy /šabs_dy
135š š š š š š š š š š š š š š š š answer.append((y1,šself.rounding(x1)))
136š š š š š š š š self.new_state(answer,šorder)
137š š š š
138š š š š defšrounding(self,šnum):
139š š š š š š š š returnšint(num +šmath.copysign(0.5,šnum))
140š š š š
141š š š š defšnew_state(self,šcells,šorder=1):
142š š š š š š š š num_states =šlen(automata.states)
143š š š š š š š š changed_cells =š[]
144š š š š š š š š foršrow,šcol inšcells:
145š š š š š š š š š š š š ifšcol >=š0šandšrow >=š0:
146š š š š š š š š š š š š š š š š try:
147š š š š š š š š š š š š š š š š š š š š index =š(automata.symbols[automata.field[row][col]]š+šnum_states +šorder)š%šnum_states
148š š š š š š š š š š š š š š š š š š š š ifšself.char !=šNonešandšself.char inšself.keys:
149š š š š š š š š š š š š š š š š š š š š š š š š index =šself.keys[self.char]
150š š š š š š š š š š š š š š š š š š š š automata.field[row][col]š=šautomata.states[index].symbol
151š š š š š š š š š š š š š š š š š š š š changed_cells.append((row,šcol))
152š š š š š š š š š š š š š š š š except:
153š š š š š š š š š š š š š š š š š š š š pass
154š š š š š š š š self.draw_cell(changed_cells)
155š š š š
156š š š š defšpress1(self,ševent):# drawer
157š š š š š š š š self.col1 =ševent.x /š(self.cell_size +šself.line_width)š-šself.offset_x
158š š š š š š š š self.row1 =ševent.y /š(self.cell_size +šself.line_width)š-šself.offset_y
159š š š š š š š š ifšself.col1 >=š0šandšself.row1 >=š0:
160š š š š š š š š š š š š self.new_state([(self.row1,šself.col1)])
161š š š š
162š š š š defšmotion1(self,ševent):# drawer
163š š š š š š š š col =š(event.x -šself.offset_x *š(self.cell_size +šself.line_width))š/š(self.cell_size +šself.line_width)
164š š š š š š š š row =š(event.y -šself.offset_y *š(self.cell_size +šself.line_width))š/š(self.cell_size +šself.line_width)
165š š š š š š š š ifšnotš(self.col1 ==šcol andšself.row1 ==šrow):
166š š š š š š š š š š š š ifšabs(self.col1 -šcol)š<=š1šandšabs(self.row1 -šrow)š<=š1:
167š š š š š š š š š š š š š š š š self.new_state([(row,šcol)])
168š š š š š š š š š š š š else:
169š š š š š š š š š š š š š š š š self.draw_line(self.col1,šself.row1,šcol,šrow)
170š š š š š š š š š š š š self.col1 =šcol
171š š š š š š š š š š š š self.row1 =šrow
172š š š š
173š š š š defšpress3(self,ševent):# drawer
174š š š š š š š š self.col3 =ševent.x /š(self.cell_size +šself.line_width)š-šself.offset_x
175š š š š š š š š self.row3 =ševent.y /š(self.cell_size +šself.line_width)š-šself.offset_y
176š š š š š š š š ifšself.col1 >=š0šandšself.row1 >=š0:
177š š š š š š š š š š š š self.new_state([(self.row3,šself.col3)],š-1)
178š š š š
179š š š š defšmotion3(self,ševent):# drawer
180š š š š š š š š col =š(event.x -šself.offset_x *š(self.cell_size +šself.line_width))š/š(self.cell_size +šself.line_width)
181š š š š š š š š row =š(event.y -šself.offset_y *š(self.cell_size +šself.line_width))š/š(self.cell_size +šself.line_width)
182š š š š š š š š ifšnotš(self.col3 ==šcol andšself.row3 ==šrow):
183š š š š š š š š š š š š ifšabs(self.col3 -šcol)š<=š1šandšabs(self.row3 -šrow)š<=š1:
184š š š š š š š š š š š š š š š š self.new_state([(row,šcol)],š-1)
185š š š š š š š š š š š š else:
186š š š š š š š š š š š š š š š š self.draw_line(self.col3,šself.row3,šcol,šrow,š-1)
187š š š š š š š š š š š š self.col3 =šcol
188š š š š š š š š š š š š self.row3 =šrow
189š š š š
190š š š š defšpress_key(self,ševent):# drawer
191š š š š š š š š self.char =ševent.char
192š š š š
193š š š š defšrelease_key(self,ševent):# drawer
194š š š š š š š š self.char =šNone
195š š š š
196š š š š defšpress1_ctrl(self,ševent):# change_offset (B1+ctrl)
197š š š š š š š š canvas.focus_set()
198š š š š š š š š self.mouse_offset_x =ševent.x
199š š š š š š š š self.mouse_offset_y =ševent.y
200š š š š
201š š š š defšmotion1_ctrl(self,ševent):# change_offset (B1+ctrl)
202š š š š š š š š self.offset_x =š(event.x -šself.mouse_offset_x)š/š(self.cell_size +šself.line_width)
203š š š š š š š š self.offset_y =š(event.y -šself.mouse_offset_y)š/š(self.cell_size +šself.line_width)
204š š š š š š š š self.mouse_offset_x =ševent.x
205š š š š š š š š self.mouse_offset_y =ševent.y
206š š š š š š š š self.draw()
207š š š š
208š š š š defšpress13(self,ševent):# zoom
209š š š š š š š š canvas.focus_set()
210š š š š š š š š self.mouse_zoom =ševent.y
211š š š š
212š š š š defšmotion13(self,ševent):# zoom
213š š š š š š š š delta =š(event.y -šself.mouse_zoom)š/šself.zoom_divisor
214š š š š š š š š self.cell_size =šself.cell_size +šdelta
215š š š š š š š š ifšself.cell_size >š50:
216š š š š š š š š š š š š self.cell_size =š50
217š š š š š š š š ifšself.cell_size <š1:
218š š š š š š š š š š š š self.cell_size =š1
219š š š š š š š š self.mouse_zoom =ševent.y
220š š š š š š š š self.draw()
221š š š š
222š š š š defšto_top(self):# replace choosen state to top
223š š š š š š š š selected =šself.selected_state
224š š š š š š š š ifšselected !=šNone:
225š š š š š š š š š š š š index =šselected
226š š š š š š š š š š š š state =šautomata.states[index]
227š š š š š š š š š š š š delšautomata.states[index]
228š š š š š š š š š š š š automata.states.insert(0,šstate)
229š š š š š š š š š š š š self.selected_state =š0
230š š š š š š š š š š š š self.refresh_dicts()
231š š š š š š š š š š š š self.refresh_list()
232š š š š
233š š š š defšto_bottom(self):# replace choosen state to botton
234š š š š š š š š selected =šself.selected_state
235š š š š š š š š ifšselected !=šNone:
236š š š š š š š š š š š š index =šselected
237š š š š š š š š š š š š state =šautomata.states[index]
238š š š š š š š š š š š š delšautomata.states[index]
239š š š š š š š š š š š š automata.states.append(state)
240š š š š š š š š š š š š self.selected_state =šlen(automata.states)š-š1
241š š š š š š š š š š š š self.refresh_dicts()
242š š š š š š š š š š š š self.refresh_list()
243š š š š
244š š š š defšupwards(self):
245š š š š š š š š selected =šself.selected_state
246š š š š š š š š ifšselected !=šNone:
247š š š š š š š š š š š š index =šselected
248š š š š š š š š š š š š ifšindex >š0:
249š š š š š š š š š š š š š š š š state =šautomata.states[index]
250š š š š š š š š š š š š š š š š delšautomata.states[index]
251š š š š š š š š š š š š š š š š automata.states.insert(index -š1,šstate)
252š š š š š š š š š š š š š š š š self.selected_state =šindex -š1
253š š š š š š š š š š š š š š š š self.refresh_dicts()
254š š š š š š š š š š š š š š š š self.refresh_list()
255š š š š
256š š š š defšdownwards(self):
257š š š š š š š š selected =šself.selected_state
258š š š š š š š š ifšselected !=šNone:
259š š š š š š š š š š š š index =šselected
260š š š š š š š š š š š š ifšindex <šstate_list.size()š-š1:
261š š š š š š š š š š š š š š š š state =šautomata.states[index]
262š š š š š š š š š š š š š š š š delšautomata.states[index]
263š š š š š š š š š š š š š š š š automata.states.insert(index +š1,šstate)
264š š š š š š š š š š š š š š š š self.selected_state =šindex +š1
265š š š š š š š š š š š š š š š š self.refresh_dicts()
266š š š š š š š š š š š š š š š š self.refresh_list()
267š š š š
268š š š š defšdelete_state(self):# delete choosen state
269š š š š š š š š selected =šself.selected_state
270š š š š š š š š ifšselected !=šNonešandšlen(automata.states)š!=š1:
271š š š š š š š š š š š š index =šselected
272š š š š š š š š š š š š symbol =šautomata.states[index].symbol
273š š š š š š š š š š š š delšautomata.states[index]
274š š š š š š š š š š š š self.refresh_dicts()
275š š š š š š š š š š š š ifšindex inšautomata.states:
276š š š š š š š š š š š š š š š š self.selected_state =šindex
277š š š š š š š š š š š š else:
278š š š š š š š š š š š š š š š š self.selected_state =šlen(automata.states)š-š1
279š š š š š š š š š š š š self.refresh_list()
280š š š š š š š š š š š š self.select_item(self.selected_state)
281š š š š š š š š š š š š self.draw_changed_state(symbol,šautomata.states[0].symbol)
282š š š š š š š š else:
283š š š š š š š š š š š š error.config(text="Operation is refused")
284š š š š š š š š š š š š error.after(2000,šself.clear_error)
285š š š š
286š š š š defšadd(self):# add new state
287š š š š š š š š name =šstate_name.get()
288š š š š š š š š symbol =šstate_symbol.get()
289š š š š š š š š key =šstate_key.get().lower()
290š š š š š š š š color =šstate_color.cget("bg")
291š š š š š š š š nums =š[]
292š š š š š š š š forši,švalue inšenumerate(ckeckbox_nums):
293š š š š š š š š š š š š š š š š ifšvalue.get()š==š1:
294š š š š š š š š š š š š š š š š š š š š nums.append(i)
295š š š š š š š š ifšself.keys.has_key(key):
296š š š š š š š š š š š š error.config(text="State with such key has already existed")
297š š š š š š š š š š š š error.after(2000,šself.clear_error)
298š š š š š š š š š š š š state_key.focus()
299š š š š š š š š elifšlen(key)š!=š1:
300š š š š š š š š š š š š error.config(text="Bad key for state")
301š š š š š š š š š š š š error.after(2000,šself.clear_error)
302š š š š š š š š š š š š state_key.focus()
303š š š š š š š š elifšautomata.symbols.has_key(symbol):
304š š š š š š š š š š š š error.config(text="State with such symbol has already existed")
305š š š š š š š š š š š š error.after(2000,šself.clear_error)
306š š š š š š š š š š š š state_symbol.focus()
307š š š š š š š š elifšlen(symbol)š!=š1:
308š š š š š š š š š š š š error.config(text="Bad symbol for state")
309š š š š š š š š š š š š error.after(2000,šself.clear_error)
310š š š š š š š š š š š š state_symbol.focus()
311š š š š š š š š else:
312š š š š š š š š š š š š state =šState(name,šsymbol,šcolor,škey,šnums)
313š š š š š š š š š š š š automata.states.append(state)
314š š š š š š š š š š š š automata.symbols[symbol]š=šlen(automata.states)š-š1
315š š š š š š š š š š š š self.keys[key]š=šlen(automata.states)š-š1
316š š š š š š š š š š š š error.config(text="")
317š š š š š š š š š š š š self.selected_state =šlen(automata.states)š-š1
318š š š š š š š š š š š š self.refresh_list()
319š š š š š š š š š š š š self.select_item(self.selected_state)
320š š š š š š š š š š š š automata.st_sym[symbol]š=šstate
321š š š š
322š š š š defšchange(self):# change chosen state
323š š š š š š š š selected =šself.selected_state
324š š š š š š š š ifšselected !=šNone:
325š š š š š š š š š š š š index =šselected
326š š š š š š š š š š š š name =šstate_name.get()
327š š š š š š š š š š š š symbol =šstate_symbol.get()
328š š š š š š š š š š š š key =šstate_key.get().lower()
329š š š š š š š š š š š š color =šstate_color.cget("bg")
330š š š š š š š š š š š š nums =š[]
331š š š š š š š š š š š š forši,švalue inšenumerate(ckeckbox_nums):
332š š š š š š š š š š š š š š š š ifšvalue.get()š==š1:
333š š š š š š š š š š š š š š š š š š š š nums.append(i)
334š š š š š š š š š š š š ifšself.keys.has_key(key)šandšself.keys[key]š!=šindex:
335š š š š š š š š š š š š š š š š error.config(text="State with such key has already existed")
336š š š š š š š š š š š š š š š š error.after(2000,šself.clear_error)
337š š š š š š š š š š š š š š š š state_key.focus()
338š š š š š š š š š š š š elifšlen(key)š!=š1:
339š š š š š š š š š š š š š š š š error.config(text="Bad key for state")
340š š š š š š š š š š š š š š š š error.after(2000,šself.clear_error)
341š š š š š š š š š š š š š š š š state_key.focus()
342š š š š š š š š š š š š elifšautomata.symbols.has_key(symbol)š andšautomata.symbols[symbol]š!=šindex:
343š š š š š š š š š š š š š š š š error.config(text="State with such symbol has already existed")
344š š š š š š š š š š š š š š š š error.after(2000,šself.clear_error)
345š š š š š š š š š š š š š š š š state_symbol.focus()
346š š š š š š š š š š š š elifšlen(symbol)š!=š1:
347š š š š š š š š š š š š š š š š error.config(text="Bad symbol for state")
348š š š š š š š š š š š š š š š š error.after(2000,šself.clear_error)
349š š š š š š š š š š š š š š š š state_symbol.focus()
350š š š š š š š š š š š š else:
351š š š š š š š š š š š š š š š š state =šState(name,šsymbol,šcolor,škey,šnums)
352š š š š š š š š š š š š š š š š self.draw_changed_state(automata.states[index].symbol,šsymbol)
353š š š š š š š š š š š š š š š š automata.states[index]š=šstate
354š š š š š š š š š š š š š š š š self.refresh_dicts()
355š š š š š š š š š š š š š š š š self.refresh_list()
356š š š š
357š š š š defšdraw_changed_state(self,šsymbol_old,šsymbol_new):
358š š š š š š š š cells =š[]
359š š š š š š š š foršrow inšrange(automata.height):
360š š š š š š š š š š š š foršcol inšrange(automata.width):
361š š š š š š š š š š š š š š š š ifšautomata.field[row][col]š==šsymbol_old:
362š š š š š š š š š š š š š š š š š š š š automata.field[row][col]š=šsymbol_new
363š š š š š š š š š š š š š š š š š š š š cells.append((row,šcol))
364š š š š š š š š
365š š š š š š š š self.draw_cell(cells)
366š š š š
367š š š š defšshow_size_window(self):
368š š š š š š š š size_window.deiconify()
369š š š š
370š š š š defšhide_size_window(self):
371š š š š š š š š size_window.withdraw()
372š š š š
373š š š š defšshow_automata_window(self):
374š š š š š š š š automata_window.deiconify()
375š š š š
376š š š š defšhide_automata_window(self):
377š š š š š š š š automata_window.withdraw()
378š š š š
379š š š š defšrefresh_list(self):
380š š š š š š š š state_list.delete(0,š"end")
381š š š š š š š š foršstate inšautomata.states:
382š š š š š š š š š š š š state_list.insert("end",šstate)
383š š š š š š š š ifšself.selected_state !=šNone:
384š š š š š š š š š š š š state_list.selection_set(self.selected_state)
385š š š š
386š š š š defšselect_item(self,šindex):
387š š š š š š š š ifšindex !=šNone:
388š š š š š š š š š š š š state =šautomata.states[index]
389š š š š š š š š š š š š state_name.delete(0,š"end")
390š š š š š š š š š š š š state_name.insert(0,šstate.name)
391š š š š š š š š š š š š state_symbol.delete(0,š"end")
392š š š š š š š š š š š š state_symbol.insert(0,šstate.symbol)
393š š š š š š š š š š š š forškey inšself.keys.keys():
394š š š š š š š š š š š š š š š š ifšself.keys[key]š==šindex:
395š š š š š š š š š š š š š š š š š š š š state_key.delete(0,š"end")
396š š š š š š š š š š š š š š š š š š š š state_key.insert(0,škey)
397š š š š š š š š š š š š state_color.config(bg=state.color)
398š š š š š š š š š š š š forši inšrange(9):
399š š š š š š š š š š š š š š š š ckeckbox_nums[i].set(i inšstate.nums)
400š š š š š š š š else:
401š š š š š š š š š š š š state_name.delete(0,š"end")
402š š š š š š š š š š š š state_symbol.delete(0,š"end")
403š š š š š š š š š š š š state_key.delete(0,š"end")
404š š š š š š š š š š š š state_color.config(bg="white")
405š š š š š š š š š š š š forši inšrange(9):
406š š š š š š š š š š š š š š š š ckeckbox_nums[i].set(False)
407š š š š
408š š š š defšlist_mouse_release(self,ševent):
409š š š š š š š š selected =šstate_list.curselection()
410š š š š š š š š self.selected_state =šint(selected[0])
411š š š š š š š š ifšlen(selected):
412š š š š š š š š š š š š self.select_item(self.selected_state)
413š š š š
414š š š š defšchoose_color(self,ševent):
415š š š š š š š š state_color.config(bg=tkColorChooser.askcolor()[1])
416š š š š
417š š š š defšclear_error(self):
418š š š š š š š š error.config(text="")
419š š š š
420š š š š defšclean_field(self):
421š š š š š š š š symbol =šautomata.states[0].symbol
422š š š š š š š š cells =š[]
423š š š š š š š š foršrow inšrange(automata.height):
424š š š š š š š š š š š š foršcol inšrange(automata.width):
425š š š š š š š š š š š š š š š š ifšautomata.field[row][col]š!=šsymbol:
426š š š š š š š š š š š š š š š š š š š š automata.field[row][col]š=šsymbol
427š š š š š š š š š š š š š š š š š š š š cells.append((row,šcol))
428š š š š š š š š self.draw_cell(cells)
429š š š š
430š š š š defšfill_randomly(self):
431š š š š š š š š cells =š[]
432š š š š š š š š foršrow inšrange(automata.height):
433š š š š š š š š š š š š foršcol inšrange(automata.width):
434š š š š š š š š š š š š š š š š automata.field[row][col]š=šautomata.states[random.randint(0,šlen(automata.states)š-š1)].symbol
435š š š š š š š š š š š š š š š š cells.append((row,šcol))
436š š š š š š š š self.draw_cell(cells)
437š š š š
438š š š š defšrefresh_dicts(self):
439š š š š š š š š automata.symbols =š{}
440š š š š š š š š automata.st_sym =š{}
441š š š š š š š š self.keys =š{}
442š š š š š š š š foršindex,šstate inšenumerate(automata.states):
443š š š š š š š š š š š š automata.symbols[state.symbol]š=šindex
444š š š š š š š š š š š š automata.st_sym[state.symbol]š=šstate
445š š š š š š š š š š š š self.keys[state.key]š=šindex
446š š š š
447
448
449root =šTk()
450root.title("Cyclic Cellular Automata")
451
452canvas =šCanvas(root,šbackground="grey")
453canvas.config(width=500,šheight=400)
454
455automata =šAutomata()
456handlers =šHandlers()
457
458canvas.tag_bind("cell",š"<1>",šhandlers.press1)
459canvas.tag_bind("cell",š"<B1-Motion>",šhandlers.motion1)
460canvas.tag_bind("cell",š"<3>",šhandlers.press3)
461canvas.tag_bind("cell",š"<B3-Motion>",šhandlers.motion3)
462canvas.bind_all("<KeyPress>",šhandlers.press_key)
463canvas.bind_all("<KeyRelease>",šhandlers.release_key)
464#canvas.bind("<Control-ButtonPress-1>", handlers.press1_ctrl)
465#canvas.bind("<Control-B1-Motion>", handlers.motion1_ctrl)
466#canvas.bind("<Shift-ButtonPress-1>", handlers.press13)
467#canvas.bind("<Shift-ButtonPress-1>", handlers.motion13)
468
469canvas.pack(fill="both",šexpand="yes")
470
471#infoPanel=Frame
472automata_window =šToplevel(root)
473automata_window.title("Automata")
474automata_window.withdraw()
475automata_window.resizable(False,šFalse)
476automata_window.protocol("WM_DELETE_WINDOW",šhandlers.hide_automata_window)
477
478headline =šLabel(automata_window,štext=š"Automata Panel",šfont=16)
479headline.pack(side="top",fill="both",šexpand="no")
480
481Label(automata_window,štext=š"State Box:").pack(side="top",šfill="x")
482
483list_frame=Frame(automata_window)
484scrollbar =šScrollbar(list_frame)
485scrollbar.pack(side="right",šfill="y")
486state_list=Listbox(list_frame,šyscrollcommand=scrollbar.set,šactivestyle="none",šselectmode="single")
487handlers.refresh_list()
488state_list.bind("<ButtonRelease-1>",šhandlers.list_mouse_release)
489state_list.pack(side="top",šfill="y")
490scrollbar.config(command=state_list.yview)
491list_frame.pack(side="top")
492
493manip_frame1 =šFrame(automata_window,špadx=10,špady=5)
494up =šButton(manip_frame1,štext="Up",šcommand=handlers.upwards,šwidth=10)
495to_top =šButton(manip_frame1,štext="To Top",šcommand=handlers.to_top,šwidth=10)
496up.pack(side="left",šfill="x")
497to_top.pack(side="right",šfill="x")
498manip_frame1.pack(side="top",šfill="x")
499
500manip_frame2 =šFrame(automata_window,špadx=10,špady=5)
501down =šButton(manip_frame2,štext="Down",šcommand=handlers.downwards,šwidth=10)
502to_bottom =šButton(manip_frame2,štext="To Bottom",šcommand=handlers.to_bottom,šwidth=10)
503down.pack(side="left",šfill="x")
504to_bottom.pack(side="right",šfill="x")
505manip_frame2.pack(side="top",šfill="x")
506
507delete =šButton(automata_window,štext="Delete",šcommand=handlers.delete_state,šwidth=10)
508delete.pack(side="top")
509
510
511information =šLabel(automata_window,štext=š"Information of State")
512information.pack(side="top",šfill="x")
513info_frame=Frame(automata_window)
514Label(info_frame,štext="Name").grid(row=0,šcolumn=0)
515state_name =šEntry(info_frame)
516state_name.grid(row=0,šcolumn=1)
517Label(info_frame,štext="Symbol").grid(row=1,šcolumn=0)
518state_symbol =šEntry(info_frame)
519state_symbol.grid(row=1,šcolumn=1)
520Label(info_frame,štext="Key").grid(row=2,šcolumn=0)
521state_key =šEntry(info_frame)
522state_key.grid(row=2,šcolumn=1)
523Label(info_frame,štext="Color").grid(row=3,šcolumn=0)
524state_color =šLabel(info_frame,šbackground="white",šcursor="plus")
525state_color.grid(row=3,šcolumn=1,šsticky="ew")
526state_color.bind('<1>',šhandlers.choose_color)
527info_frame.pack(side="top")
528
529
530ckeckbox_nums =š[IntVar(),šIntVar(),šIntVar(),šIntVar(),šIntVar(),š
531š š š š š š š š š š š š š š š š š š š š š š š š š š š š IntVar(),šIntVar(),šIntVar(),šIntVar()]
532
533condition =šLabel(automata_window,štext=š"Condition of conversion")
534condition.pack(side="top",šfill="x")
535condition_frame=Frame(automata_window)
536Label(condition_frame,štext="0: ").grid(row=0,šcolumn=0)
537c_button_0 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[0])
538c_button_0.grid(row=0,šcolumn=1)
539Label(condition_frame,štext="1: ").grid(row=0,šcolumn=2)
540c_button_1 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[1])
541c_button_1.grid(row=0,šcolumn=3)
542Label(condition_frame,štext="2: ").grid(row=0,šcolumn=4)
543c_button_2 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[2])
544c_button_2.grid(row=0,šcolumn=5)
545Label(condition_frame,štext="3: ").grid(row=1,šcolumn=0)
546c_button_3 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[3])
547c_button_3.grid(row=1,šcolumn=1)
548Label(condition_frame,štext="4: ").grid(row=1,šcolumn=2)
549c_button_4 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[4])
550c_button_4.grid(row=1,šcolumn=3)
551Label(condition_frame,štext="5: ").grid(row=1,šcolumn=4)
552c_button_5 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[5])
553c_button_5.grid(row=1,šcolumn=5)
554Label(condition_frame,štext="6: ").grid(row=2,šcolumn=0)
555c_button_6 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[6])
556c_button_6.grid(row=2,šcolumn=1)
557Label(condition_frame,štext="7: ").grid(row=2,šcolumn=2)
558c_button_7 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[7])
559c_button_7.grid(row=2,šcolumn=3)
560Label(condition_frame,štext="8: ").grid(row=2,šcolumn=4)
561c_button_8 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[8])
562c_button_8.grid(row=2,šcolumn=5)
563condition_frame.pack(side="top")
564
565
566add_frame =šFrame(automata_window,špadx=10,špady=5)
567add_state =šButton(add_frame,štext="Add",šcommand=handlers.add,šwidth=10)
568change_state =šButton(add_frame,štext="Change",šcommand=handlers.change,šwidth=10)
569add_state.pack(side="left",šfill="x")
570change_state.pack(side="right",šfill="x")
571add_frame.pack(side="top",šfill="x")
572
573error=Label(automata_window)
574error.pack(side="top",šfill="x")
575
576
577side =š0
578
579size_window =šToplevel(root)
580size_window.title("")
581size_window.withdraw()
582size_window.resizable(False,šFalse)
583size_window.protocol("WM_DELETE_WINDOW",šhandlers.hide_size_window)
584Label(size_window,štext=š"Current size of window:").pack(side="top",šfill="x")
585size =šLabel(size_window,štext=šstr(len(automata.field))š+š" x "š+šstr(len(automata.field[0])))
586size.pack(side="top",šfill="x")
587Label(size_window,štext=š"New size:").pack(side="top",šfill="x")
588new_size =šFrame(size_window)
589size_x =šEntry(new_size,šwidth=5)
590size_x.grid(row=0,šcolumn=0)
591Label(new_size,štext=" x ").grid(row=0,šcolumn=1)
592size_y =šEntry(new_size,šwidth=5)
593size_y.grid(row=0,šcolumn=2)
594new_size.pack(side="top")
595Label(size_window,štext=š"Expansion of window:").pack(side="top",šfill="x")
596expansion =šFrame(size_window)
597r0 =šRadiobutton(expansion,švariable=side,švalue =š0,šindicatoron=0,šwidth=2,šheight=1)
598r0.select()
599r0.grid(row=0,šcolumn=0)š š
600r1 =šRadiobutton(expansion,švariable=side,švalue =š1,šindicatoron=0,šwidth=2,šheight=1)
601r1.grid(row=0,šcolumn=1)š š
602r2 =šRadiobutton(expansion,švariable=side,švalue =š2,šindicatoron=0,šwidth=2,šheight=1)
603r2.grid(row=0,šcolumn=2)š š
604r3 =šRadiobutton(expansion,švariable=side,švalue =š3,šindicatoron=0,šwidth=2,šheight=1)
605r3.grid(row=1,šcolumn=0)š š
606r4 =šRadiobutton(expansion,švariable=side,švalue =š4,šindicatoron=0,šwidth=2,šheight=1)
607r4.grid(row=1,šcolumn=1)š š
608r5 =šRadiobutton(expansion,švariable=side,švalue =š5,šindicatoron=0,šwidth=2,šheight=1)
609r5.grid(row=1,šcolumn=2)š š
610r6 =šRadiobutton(expansion,švariable=side,švalue =š6,šindicatoron=0,šwidth=2,šheight=1)
611r6.grid(row=2,šcolumn=0)š š
612r7 =šRadiobutton(expansion,švariable=side,švalue =š7,šindicatoron=0,šwidth=2,šheight=1)
613r7.grid(row=2,šcolumn=1)š š
614r8 =šRadiobutton(expansion,švariable=side,švalue =š8,šindicatoron=0,šwidth=2,šheight=1)
615r8.grid(row=2,šcolumn=2)
616expansion.pack(side="top")
617Label(size_window).pack(side="top",šfill="x")
618apply_frame =šFrame(size_window,špadx=10,špady=5)
619apply_size =šButton(apply_frame,štext="Apply",šwidth=6)
620apply_size.pack(side="left",šfill="x")
621close_size =šButton(apply_frame,štext="Close",šcommand=handlers.hide_size_window,šwidth=6)
622close_size.pack(side="right",šfill="x")
623apply_frame.pack(side="top",šfill="x")
624
625menubar =šMenu(root)
626root.config(menu=menubar)
627
628menu_file =šMenu(menubar)
629menu_file.add_command(label="New")
630menu_file.add_command(label="Open...",šcommand=handlers.open_file)
631menu_file.add_command(label="Save...",šcommand=handlers.save_file)
632menu_file.add_separator()
633menu_file.add_command(label="Exit",šcommand=root.destroy)
634menubar.add_cascade(label="File",šmenu=menu_file)
635
636menu_action =šMenu(menubar)
637menu_action.add_command(label="Start",šcommand=handlers.start)
638menu_action.add_command(label="Stop",šcommand=handlers.stop)
639menu_action.add_command(label="Next Step",šcommand=handlers.next_step)
640menu_action.add_separator()
641menu_action.add_command(label="Increase speed",šcommand=handlers.faster)
642menu_action.add_command(label="Decrease speed",šcommand=handlers.slower)
643menu_action.add_separator()
644menu_action.add_command(label="Zoom In",šcommand=handlers.zoom_in)
645menu_action.add_command(label="Zoom Out",šcommand=handlers.zoom_out)
646menu_action.add_separator()
647menu_action.add_command(label="Clean field",šcommand=handlers.clean_field)
648menu_action.add_command(label="Fill randomly",šcommand=handlers.fill_randomly)
649menu_action.add_separator()
650menu_action.add_command(label="Change size",command=handlers.show_size_window)
651menubar.add_cascade(label="Action",šmenu=menu_action)
652
653menubar.add_command(label="Automata",šcommand=handlers.show_automata_window)
654
655menubar.add_command(label="Help",šcommand=handlers.show_help_window)
656
657root.mainloop()
658
Note: See TracBrowser for help on using the repository browser.