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

source: Interface.py @ 85:eec51a7eb05c

Revision 85:eec51a7eb05c, 25.2 KB checked in by is_rusinov, 5 years ago (diff)

correct mistake in mouse draw fix #20

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