| 1 | importšmath |
|---|
| 2 | importšrandom |
|---|
| 3 | importšpickle |
|---|
| 4 | importštkColorChooser |
|---|
| 5 | importštkFileDialog |
|---|
| 6 | importštkMessageBox |
|---|
| 7 | fromšTkinteršimportš* |
|---|
| 8 | |
|---|
| 9 | fromšStatešimportš* |
|---|
| 10 | fromšAutomatašimportš* |
|---|
| 11 | |
|---|
| 12 | |
|---|
| 13 | classš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 | |
|---|
| 484 | root =šTk() |
|---|
| 485 | root.title("Cyclic Cellular Automata") |
|---|
| 486 | |
|---|
| 487 | canvas =šCanvas(root,šbackground="grey") |
|---|
| 488 | canvas.config(width=500,šheight=400) |
|---|
| 489 | |
|---|
| 490 | automata =šAutomata() |
|---|
| 491 | handlers =šHandlers() |
|---|
| 492 | |
|---|
| 493 | canvas.tag_bind("cell",š"<1>",šhandlers.press1) |
|---|
| 494 | canvas.tag_bind("cell",š"<B1-Motion>",šhandlers.motion1) |
|---|
| 495 | canvas.tag_bind("cell",š"<3>",šhandlers.press3) |
|---|
| 496 | canvas.tag_bind("cell",š"<B3-Motion>",šhandlers.motion3) |
|---|
| 497 | canvas.bind_all("<KeyPress>",šhandlers.press_key) |
|---|
| 498 | canvas.bind_all("<KeyRelease>",šhandlers.release_key) |
|---|
| 499 | |
|---|
| 500 | scroll_x=Scrollbar(root,šorient="horizontal") |
|---|
| 501 | scroll_y=Scrollbar(root,šorient="vertical") |
|---|
| 502 | |
|---|
| 503 | canvas.grid(row=0,šcolumn=0,šsticky="nsew") |
|---|
| 504 | scroll_y.grid(row=0,šcolumn=1,šsticky="ns") |
|---|
| 505 | scroll_x.grid(row=1,šcolumn=0,šsticky="ew") |
|---|
| 506 | |
|---|
| 507 | handlers.change_scroll_area() |
|---|
| 508 | canvas.config(xscrollcommand=scroll_x.set,šyscrollcommand=scroll_y.set) |
|---|
| 509 | scroll_x.config(command=canvas.xview) |
|---|
| 510 | scroll_y.config(command=canvas.yview) |
|---|
| 511 | root.columnconfigure(0,šweight=1) |
|---|
| 512 | root.rowconfigure(0,šweight=1) |
|---|
| 513 | |
|---|
| 514 | |
|---|
| 515 | #infoPanel=Frame |
|---|
| 516 | automata_window =šToplevel(root) |
|---|
| 517 | automata_window.title("Automata") |
|---|
| 518 | automata_window.withdraw() |
|---|
| 519 | automata_window.resizable(False,šFalse) |
|---|
| 520 | automata_window.protocol("WM_DELETE_WINDOW",šhandlers.hide_automata_window) |
|---|
| 521 | |
|---|
| 522 | headline =šLabel(automata_window,štext=š"Automata Panel",šfont=16) |
|---|
| 523 | headline.pack(side="top",fill="both",šexpand="no") |
|---|
| 524 | |
|---|
| 525 | Label(automata_window,štext=š"State Box:").pack(side="top",šfill="x") |
|---|
| 526 | |
|---|
| 527 | list_frame=Frame(automata_window) |
|---|
| 528 | scrollbar =šScrollbar(list_frame) |
|---|
| 529 | scrollbar.pack(side="right",šfill="y") |
|---|
| 530 | state_list=Listbox(list_frame,šyscrollcommand=scrollbar.set,šactivestyle="none",šselectmode="single") |
|---|
| 531 | handlers.refresh_list() |
|---|
| 532 | state_list.bind("<ButtonRelease-1>",šhandlers.list_mouse_release) |
|---|
| 533 | state_list.pack(side="top",šfill="y") |
|---|
| 534 | scrollbar.config(command=state_list.yview) |
|---|
| 535 | list_frame.pack(side="top") |
|---|
| 536 | |
|---|
| 537 | manip_frame1 =šFrame(automata_window,špadx=10,špady=5) |
|---|
| 538 | up =šButton(manip_frame1,štext="Up",šcommand=handlers.upwards,šwidth=10) |
|---|
| 539 | to_top =šButton(manip_frame1,štext="To Top",šcommand=handlers.to_top,šwidth=10) |
|---|
| 540 | up.pack(side="left",šfill="x") |
|---|
| 541 | to_top.pack(side="right",šfill="x") |
|---|
| 542 | manip_frame1.pack(side="top",šfill="x") |
|---|
| 543 | |
|---|
| 544 | manip_frame2 =šFrame(automata_window,špadx=10,špady=5) |
|---|
| 545 | down =šButton(manip_frame2,štext="Down",šcommand=handlers.downwards,šwidth=10) |
|---|
| 546 | to_bottom =šButton(manip_frame2,štext="To Bottom",šcommand=handlers.to_bottom,šwidth=10) |
|---|
| 547 | down.pack(side="left",šfill="x") |
|---|
| 548 | to_bottom.pack(side="right",šfill="x") |
|---|
| 549 | manip_frame2.pack(side="top",šfill="x") |
|---|
| 550 | |
|---|
| 551 | delete =šButton(automata_window,štext="Delete",šcommand=handlers.delete_state,šwidth=10) |
|---|
| 552 | delete.pack(side="top") |
|---|
| 553 | |
|---|
| 554 | |
|---|
| 555 | information =šLabel(automata_window,štext=š"Information of State") |
|---|
| 556 | information.pack(side="top",šfill="x") |
|---|
| 557 | info_frame=Frame(automata_window) |
|---|
| 558 | Label(info_frame,štext="Name").grid(row=0,šcolumn=0) |
|---|
| 559 | state_name =šEntry(info_frame) |
|---|
| 560 | state_name.grid(row=0,šcolumn=1) |
|---|
| 561 | Label(info_frame,štext="Symbol").grid(row=1,šcolumn=0) |
|---|
| 562 | state_symbol =šEntry(info_frame) |
|---|
| 563 | state_symbol.grid(row=1,šcolumn=1) |
|---|
| 564 | Label(info_frame,štext="Key").grid(row=2,šcolumn=0) |
|---|
| 565 | state_key =šEntry(info_frame) |
|---|
| 566 | state_key.grid(row=2,šcolumn=1) |
|---|
| 567 | Label(info_frame,štext="Color").grid(row=3,šcolumn=0) |
|---|
| 568 | state_color =šLabel(info_frame,šbackground="white",šcursor="plus") |
|---|
| 569 | state_color.grid(row=3,šcolumn=1,šsticky="ew") |
|---|
| 570 | state_color.bind('<1>',šhandlers.choose_color) |
|---|
| 571 | info_frame.pack(side="top") |
|---|
| 572 | |
|---|
| 573 | |
|---|
| 574 | ckeckbox_nums =š[IntVar(),šIntVar(),šIntVar(),šIntVar(),šIntVar(),š |
|---|
| 575 | š š š š š š š š š š š š š š š š š š š š š š š š š š š š IntVar(),šIntVar(),šIntVar(),šIntVar()] |
|---|
| 576 | |
|---|
| 577 | condition =šLabel(automata_window,štext=š"Condition of conversion") |
|---|
| 578 | condition.pack(side="top",šfill="x") |
|---|
| 579 | condition_frame=Frame(automata_window) |
|---|
| 580 | Label(condition_frame,štext="0: ").grid(row=0,šcolumn=0) |
|---|
| 581 | c_button_0 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[0]) |
|---|
| 582 | c_button_0.grid(row=0,šcolumn=1) |
|---|
| 583 | Label(condition_frame,štext="1: ").grid(row=0,šcolumn=2) |
|---|
| 584 | c_button_1 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[1]) |
|---|
| 585 | c_button_1.grid(row=0,šcolumn=3) |
|---|
| 586 | Label(condition_frame,štext="2: ").grid(row=0,šcolumn=4) |
|---|
| 587 | c_button_2 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[2]) |
|---|
| 588 | c_button_2.grid(row=0,šcolumn=5) |
|---|
| 589 | Label(condition_frame,štext="3: ").grid(row=1,šcolumn=0) |
|---|
| 590 | c_button_3 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[3]) |
|---|
| 591 | c_button_3.grid(row=1,šcolumn=1) |
|---|
| 592 | Label(condition_frame,štext="4: ").grid(row=1,šcolumn=2) |
|---|
| 593 | c_button_4 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[4]) |
|---|
| 594 | c_button_4.grid(row=1,šcolumn=3) |
|---|
| 595 | Label(condition_frame,štext="5: ").grid(row=1,šcolumn=4) |
|---|
| 596 | c_button_5 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[5]) |
|---|
| 597 | c_button_5.grid(row=1,šcolumn=5) |
|---|
| 598 | Label(condition_frame,štext="6: ").grid(row=2,šcolumn=0) |
|---|
| 599 | c_button_6 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[6]) |
|---|
| 600 | c_button_6.grid(row=2,šcolumn=1) |
|---|
| 601 | Label(condition_frame,štext="7: ").grid(row=2,šcolumn=2) |
|---|
| 602 | c_button_7 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[7]) |
|---|
| 603 | c_button_7.grid(row=2,šcolumn=3) |
|---|
| 604 | Label(condition_frame,štext="8: ").grid(row=2,šcolumn=4) |
|---|
| 605 | c_button_8 =šCheckbutton(condition_frame,švariable=ckeckbox_nums[8]) |
|---|
| 606 | c_button_8.grid(row=2,šcolumn=5) |
|---|
| 607 | condition_frame.pack(side="top") |
|---|
| 608 | |
|---|
| 609 | |
|---|
| 610 | add_frame =šFrame(automata_window,špadx=10,špady=5) |
|---|
| 611 | add_state =šButton(add_frame,štext="Add",šcommand=handlers.add,šwidth=10) |
|---|
| 612 | change_state =šButton(add_frame,štext="Change",šcommand=handlers.change,šwidth=10) |
|---|
| 613 | add_state.pack(side="left",šfill="x") |
|---|
| 614 | change_state.pack(side="right",šfill="x") |
|---|
| 615 | add_frame.pack(side="top",šfill="x") |
|---|
| 616 | |
|---|
| 617 | error=Label(automata_window) |
|---|
| 618 | error.pack(side="top",šfill="x") |
|---|
| 619 | |
|---|
| 620 | |
|---|
| 621 | side =šIntVar() |
|---|
| 622 | |
|---|
| 623 | size_window =šToplevel(root) |
|---|
| 624 | size_window.title("") |
|---|
| 625 | size_window.withdraw() |
|---|
| 626 | size_window.resizable(False,šFalse) |
|---|
| 627 | size_window.protocol("WM_DELETE_WINDOW",šhandlers.hide_size_window) |
|---|
| 628 | Label(size_window,štext=š"Current size of window:").pack(side="top",šfill="x") |
|---|
| 629 | size =šLabel(size_window,štext=šstr(len(automata.field))š+š" x "š+šstr(len(automata.field[0]))) |
|---|
| 630 | size.pack(side="top",šfill="x") |
|---|
| 631 | Label(size_window,štext=š"New size:").pack(side="top",šfill="x") |
|---|
| 632 | new_size =šFrame(size_window) |
|---|
| 633 | size_x =šEntry(new_size,šwidth=5) |
|---|
| 634 | size_x.grid(row=0,šcolumn=0) |
|---|
| 635 | Label(new_size,štext=" x ").grid(row=0,šcolumn=1) |
|---|
| 636 | size_y =šEntry(new_size,šwidth=5) |
|---|
| 637 | size_y.grid(row=0,šcolumn=2) |
|---|
| 638 | new_size.pack(side="top") |
|---|
| 639 | Label(size_window,štext=š"Expansion of window:").pack(side="top",šfill="x") |
|---|
| 640 | expansion =šFrame(size_window) |
|---|
| 641 | r0 =šRadiobutton(expansion,švariable=side,švalue =š0,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 642 | r0.select() |
|---|
| 643 | r0.grid(row=0,šcolumn=0)š š |
|---|
| 644 | r1 =šRadiobutton(expansion,švariable=side,švalue =š1,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 645 | r1.grid(row=0,šcolumn=1)š š |
|---|
| 646 | r2 =šRadiobutton(expansion,švariable=side,švalue =š2,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 647 | r2.grid(row=0,šcolumn=2)š š |
|---|
| 648 | r3 =šRadiobutton(expansion,švariable=side,švalue =š3,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 649 | r3.grid(row=1,šcolumn=0)š š |
|---|
| 650 | r4 =šRadiobutton(expansion,švariable=side,švalue =š4,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 651 | r4.grid(row=1,šcolumn=1)š š |
|---|
| 652 | r5 =šRadiobutton(expansion,švariable=side,švalue =š5,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 653 | r5.grid(row=1,šcolumn=2)š š |
|---|
| 654 | r6 =šRadiobutton(expansion,švariable=side,švalue =š6,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 655 | r6.grid(row=2,šcolumn=0)š š |
|---|
| 656 | r7 =šRadiobutton(expansion,švariable=side,švalue =š7,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 657 | r7.grid(row=2,šcolumn=1)š š |
|---|
| 658 | r8 =šRadiobutton(expansion,švariable=side,švalue =š8,šindicatoron=0,šwidth=2,šheight=1) |
|---|
| 659 | r8.grid(row=2,šcolumn=2) |
|---|
| 660 | expansion.pack(side="top") |
|---|
| 661 | Label(size_window).pack(side="top",šfill="x") |
|---|
| 662 | apply_frame =šFrame(size_window,špadx=10,špady=5) |
|---|
| 663 | apply_size =šButton(apply_frame,štext="Apply",šwidth=6,šcommand=handlers.change_size) |
|---|
| 664 | apply_size.pack(side="left",šfill="x") |
|---|
| 665 | close_size =šButton(apply_frame,štext="Close",šcommand=handlers.hide_size_window,šwidth=6) |
|---|
| 666 | close_size.pack(side="right",šfill="x") |
|---|
| 667 | apply_frame.pack(side="top",šfill="x") |
|---|
| 668 | message =šLabel(size_window,štext="") |
|---|
| 669 | message.pack(side="top",šfill="x") |
|---|
| 670 | menubar =šMenu(root) |
|---|
| 671 | root.config(menu=menubar) |
|---|
| 672 | |
|---|
| 673 | menu_file =šMenu(menubar) |
|---|
| 674 | menu_file.add_command(label="New",šcommand=handlers.new_file,šaccelerator="Ctrl+N") |
|---|
| 675 | menu_file.bind_all("<Control-n>",šhandlers.new_file) |
|---|
| 676 | menu_file.add_command(label="Open...",šcommand=handlers.open_file,šaccelerator="Ctrl+O") |
|---|
| 677 | menu_file.bind_all("<Control-o>",šhandlers.open_file) |
|---|
| 678 | menu_file.add_command(label="Save...",šcommand=handlers.save_file,šaccelerator="Ctrl+S") |
|---|
| 679 | menu_file.bind_all("<Control-s>",šhandlers.save_file) |
|---|
| 680 | menu_file.add_separator() |
|---|
| 681 | menu_file.add_command(label="Exit",šcommand=handlers.exit,šaccelerator="Ctrl+Q") |
|---|
| 682 | menu_file.bind_all("<Control-q>",šhandlers.exit) |
|---|
| 683 | menubar.add_cascade(label="File",šmenu=menu_file) |
|---|
| 684 | |
|---|
| 685 | menu_action =šMenu(menubar) |
|---|
| 686 | menu_action.add_command(label="Start",šcommand=handlers.start,šaccelerator="Ctrl+G") |
|---|
| 687 | menu_action.bind_all("<Control-g>",šhandlers.start) |
|---|
| 688 | menu_action.add_command(label="Stop",šcommand=handlers.stop,šaccelerator="Ctrl+F") |
|---|
| 689 | menu_action.bind_all("<Control-f>",šhandlers.stop) |
|---|
| 690 | menu_action.add_command(label="Next Step",šcommand=handlers.next_step,šaccelerator="Space") |
|---|
| 691 | menu_action.bind_all("<space>",šhandlers.next_step) |
|---|
| 692 | menu_action.add_separator() |
|---|
| 693 | menu_action.add_command(label="Increase speed",šcommand=handlers.faster,šaccelerator="Alt+F") |
|---|
| 694 | menu_action.bind_all("<Alt-f>",šhandlers.faster) |
|---|
| 695 | menu_action.add_command(label="Decrease speed",šcommand=handlers.slower,šaccelerator="Alt+S") |
|---|
| 696 | menu_action.bind_all("<Alt-s>",šhandlers.slower) |
|---|
| 697 | menu_action.add_separator() |
|---|
| 698 | menu_action.add_command(label="Zoom In",šcommand=handlers.zoom_in,šaccelerator="Ctrl+Z") |
|---|
| 699 | menu_action.bind_all("<Control-z>",šhandlers.zoom_in) |
|---|
| 700 | menu_action.add_command(label="Zoom Out",šcommand=handlers.zoom_out,šaccelerator="Ctrl+X") |
|---|
| 701 | menu_action.bind_all("<Control-x>",šhandlers.zoom_out) |
|---|
| 702 | menu_action.add_separator() |
|---|
| 703 | menu_action.add_command(label="Clean field",šcommand=handlers.clean_field,šaccelerator="Ctrl+C") |
|---|
| 704 | menu_action.bind_all("<Control-c>",šhandlers.clean_field) |
|---|
| 705 | menu_action.add_command(label="Fill randomly",šcommand=handlers.fill_randomly,šaccelerator="Ctrl+R") |
|---|
| 706 | menu_action.bind_all("<Control-r>",šhandlers.fill_randomly) |
|---|
| 707 | menu_action.add_separator() |
|---|
| 708 | menu_action.add_command(label="Change size",command=handlers.show_size_window,šaccelerator="Ctrl+D") |
|---|
| 709 | menu_action.bind_all("<Control-d>",šhandlers.show_size_window) |
|---|
| 710 | menubar.add_cascade(label="Action",šmenu=menu_action) |
|---|
| 711 | |
|---|
| 712 | menubar.add_command(label="Automata",šcommand=handlers.show_automata_window) |
|---|
| 713 | |
|---|
| 714 | menubar.add_command(label="Help",šcommand=handlers.show_help_window) |
|---|
| 715 | |
|---|
| 716 | root.mainloop() |
|---|
| 717 | |
|---|