def end_game(): if ActiveCheck.not_active(): return # We're at the end if numgame is not None and sp.ngame >= numgame: if sp.profile_running: sp.pr.disable() s = io.StringIO() sortby = 'cumulative' ps = pstats.Stats(sp.pr, stream=s).sort_stats(sortby) ps.print_stats() SlTrace.lg(s.getvalue()) SlTrace.lg("end_game: game={:d}". format(sp.ngame)) pl_str = "s" if numgame != 1 else "" SlTrace.lg("Ending program after {:d} game{}".format(numgame, pl_str)) pgm_exit() if sp.restart_game: mw.after(0, new_game) elif loop and not sp.game_stopped: if loop_after > 0: SlTrace.lg("Restarting game after %.0f seconds" % loop_after) sp.game_count_down(wait_time=loop_after,inc=1) mw.after(0, new_game)
def display_update(self): """ Update display after command Display all changed parts, clearing modify flags """ if ActiveCheck.not_active(): return command_manager = self.command_manager user_module = command_manager.user_module user_module.update_score_window() ids = self.get_changed(clear=True) if CanvasTracked.tag_track_delete is not None: self.show_display() SlTrace.lg( f"display_update: tracking: {CanvasTracked.tag_track_delete} in {self}" ) pdos = self.display_order(ids) # Order display for new_part in pdos: part_id = new_part.part_id if not new_part.connecteds: SlTrace.lg("new_part no connecteds") ###continue part = user_module.get_part(part_id) if CanvasTracked.tag_track_delete is not None: self.show_display() SlTrace.lg( f"display_update: tracking: {CanvasTracked.tag_track_delete} in {self}" ) part.display()
def blink_on_next(self): if ActiveCheck.not_active(): return False # We're at the end if not self.is_blinking(): return False si = self.first_fill_index # Source of new state(e.g. fill) SlTrace.lg("blink_on_next first_fill_index=%d in %s" % (si, self.part), "blink") for taggroup in self.multitags: if si >= len(self.multitags): si = 0 # Wrap around src_fill_group = self.multifills[si] for i in range(len(taggroup)): itag = ifill = i # May have different lengths if itag >= len(taggroup): itag = len(taggroup) - 1 # Use last if ifill >= len(src_fill_group): ifill = len(src_fill_group) - 1 try: self.canvas.itemconfigure(taggroup[itag], fill=src_fill_group[ifill]) except: SlTrace.lg("Out of range") return si += 1 # Go to next fill group self.first_fill_index += 1 if self.first_fill_index >= len(self.multitags): self.first_fill_index = 0 # Wrap around self.canvas.after(int(1000 * self.on_time), self.blink_on_next) return True
def end_game(): if ActiveCheck.not_active(): return # We're at the end if sp.restart_game: mw.after(0, new_game) elif loop and not sp.game_stopped: SlTrace.lg("Restarting game after %.0f seconds" % loop_after) sp.game_count_down(wait_time=loop_after,inc=1) mw.after(0, new_game)
def blink_off(self): if ActiveCheck.not_active(): return False # We're at the end if not self.is_blinking(): return False if self.on_state: self.canvas.itemconfigure(self.tag, fill=self.off_fill) self.on_state = False self.canvas.after(int(1000 * self.off_time), self.blink_on) return True
def blink_on_first(self): """ Just set going - assumes first is displayed """ if ActiveCheck.not_active(): return False # We're at the end if not self.is_blinking(): return False self.first_fill_index = 1 if self.first_fill_index >= len(self.multitags): self.first_fill_index = 0 # Wrap around self.canvas.after(int(1000 * self.on_time), self.blink_on_next) return True
def one_run(): """ One run loop with a call back """ if ActiveCheck.not_active(): return # We're at the end global n_arrange if run_running: step_button() if run_running: n_arrange = app.get_current_val("arrange_number", 3) if n_arrange > 0: time_step = app.get_current_val("arrange_time", 10) else: time_step = app.get_current_val("time_step", 100) mw.after(time_step, one_run) # Call us after time_step
def display_clear(self, part, display=False): """ Clear out display of current edge :part: displayed part ;display: True - update display, default: no update """ if ActiveCheck.not_active(): return # At end if self.game_control.area is None: return if self.game_control.area.canvas is None: return if part.part_id not in self.game_control.area.parts_by_id: SlTrace.lg(f"part {part} not in parts_by_id") self.delete_objects(part) self.delete_tags(part) if display: self.game_control.area.mw.update()
def display_update(self): """ Update display after command Display all changed parts, clearing modify flags """ if ActiveCheck.not_active(): return command_manager = self.command_manager user_module = command_manager.user_module user_module.update_score_window() ids = self.get_changed(clear=True) pdos = self.display_order(ids) # Order display for new_part in pdos: part_id = new_part.part_id if not new_part.connecteds: SlTrace.lg("new_part no connecteds") ###continue part = user_module.get_part(part_id) part.display()
def display(self): """ Display edge as a rectangle We leave room for the corners at each end Highlight if appropriate """ if not self.sel_area.display_game: return if ActiveCheck.not_active(): return if CanvasTracked.tag_track_delete is not None: SlTrace.lg( f"display_clear: tracking: {CanvasTracked.tag_track_delete} in {self}" ) self.part_check(prefix="display") if SlTrace.trace("dbg"): SlTrace.lg("dbg") self.display_clear() ''' if (self.invisible and not self.highlighted and not self.turned_on and not self.is_selected()): self.display_clear() return ''' SlTrace.lg("%s: %s at %s" % (self.part_type, self, str(self.loc)), "display") if self.highlighted: self.set_view_highlighted() elif self.is_selected(): self.set_view_selected() else: # Not highlighted self.set_view_default() if SlTrace.trace("show_id"): dir_x, dir_y = self.edge_dxy() chr_w = 5 chr_h = chr_w * 2 if dir_x != 0: # sideways offset_x = -len(str(self.part_id)) * chr_w / 2 + chr_w offset_y = chr_h if dir_y != 0: # up/down offset_x = len(str(self.part_id)) * chr_w offset_y = 0 c1x, c1y, c3x, c3y = self.get_rect() cx = (c1x + c3x) / 2 + offset_x cy = (c1y + c3y) / 2 + offset_y self.name_tag = self.display_text((cx, cy), text=str(self.part_id)) self.add_display_tags(self.name_tag) if self.move_no is not None and SlTrace.trace("show_move"): c1x, c1y, c3x, c3y = self.get_rect() dir_x, dir_y = self.edge_dxy() chr_w = 5 chr_h = chr_w * 2 if dir_x != 0: # sideways offset_x = -len(str(self.move_no)) * chr_w / 2 + chr_w offset_y = chr_h if dir_y != 0: # up/down offset_x = len(str(self.move_no)) * chr_w + 2 offset_y = 0 cx = (c1x + c3x) / 2 + offset_x cy = (c1y + c3y) / 2 + offset_y self.move_no_tag = self.display_text((cx, cy), text=str(self.move_no)) self.add_display_tags(self.move_no_tag) SlTrace.lg(" part showing move_no %s" % self, "show_move_print") self.sel_area.mw.update_idletasks()
def display(self): """ Display edge as a rectangle We leave room for the corners at each end Highlight if appropriate """ if ActiveCheck.not_active(): return self.part_check(prefix="display") if SlTrace.trace("dbg"): SlTrace.lg("dbg") self.display_clear() if (self.invisible and not self.highlighted and not self.turned_on and not self.is_selected()): self.display_clear() return c1x, c1y, c3x, c3y = self.get_rect( ) # Vales are modified if appropriate loc = self.loc SlTrace.lg("%s: %s at %s" % (self.part_type, self, str(loc)), "display") if self.highlighted or self.is_selected(): if self.turned_on: if self.on_highlighting: if self.player is not None: # Check if indicators on self.display_indicator(player=self.player) self.blink(self.display_multi_tags) else: c1x, c1y, c3x, c3y = self.get_rect(enlarge=True) self.highlight_tag = self.sel_area.canvas.create_rectangle( c1x, c1y, c3x, c3y, fill=SelectPart.edge_fill_highlight) self.blink(self.highlight_tag, off_fill="red") else: if self.off_highlighting: self.display_indicator( fills=["purple", "darkgray", "orange"]) self.blink(self.display_multi_tags) else: c1x, c1y, c3x, c3y = self.get_rect() self.display_clear() else: # Not highlighted self.display_clear() c1x, c1y, c3x, c3y = self.get_rect() if self.is_turned_on(): self.display_indicator(player=self.player) if SlTrace.trace("show_id"): dir_x, dir_y = self.edge_dxy() chr_w = 5 chr_h = chr_w * 2 if dir_x != 0: # sideways offset_x = -len(str(self.part_id)) * chr_w / 2 + chr_w offset_y = chr_h if dir_y != 0: # up/down offset_x = len(str(self.part_id)) * chr_w offset_y = 0 cx = (c1x + c3x) / 2 + offset_x cy = (c1y + c3y) / 2 + offset_y self.name_tag = self.display_text((cx, cy), text=str(self.part_id)) if self.move_no is not None and SlTrace.trace("show_move"): dir_x, dir_y = self.edge_dxy() chr_w = 5 chr_h = chr_w * 2 if dir_x != 0: # sideways offset_x = -len(str(self.move_no)) * chr_w / 2 + chr_w offset_y = chr_h if dir_y != 0: # up/down offset_x = len(str(self.move_no)) * chr_w + 2 offset_y = 0 cx = (c1x + c3x) / 2 + offset_x cy = (c1y + c3y) / 2 + offset_y self.move_no_tag = self.display_text((cx, cy), text=str(self.move_no)) SlTrace.lg(" part showing move_no %s" % self, "show_move_print") self.sel_area.mw.update_idletasks()