def _handle_toplevel_response(self, msg: ToplevelResponse) -> None: if msg.get("error"): self._insert_text_directly(msg["error"] + "\n", ("toplevel", "stderr")) self._ensure_visible() if "user_exception" in msg: self._show_user_exception(msg["user_exception"]) self._ensure_visible() welcome_text = msg.get("welcome_text") if welcome_text and welcome_text != self._last_welcome_text: self._insert_text_directly(welcome_text, ("comment", )) self._last_welcome_text = welcome_text if "value_info" in msg: num_stripped_question_marks = getattr( msg, "num_stripped_question_marks", 0) if num_stripped_question_marks > 0: # show the value in object inspector get_workbench().event_generate("ObjectSelect", object_id=msg["value_info"].id) else: # show the value in shell value_repr = shorten_repr(msg["value_info"].repr, 10000) if value_repr != "None": if get_workbench().in_heap_mode(): value_repr = memory.format_object_id( msg["value_info"].id) object_tag = "object_" + str(msg["value_info"].id) self._insert_text_directly( value_repr + "\n", ("toplevel", "value", object_tag)) if running_on_mac_os(): sequence = "<Command-Button-1>" else: sequence = "<Control-Button-1>" self.tag_bind( object_tag, sequence, lambda _: get_workbench().event_generate( "ObjectSelect", object_id=msg["value_info"].id), ) self.active_object_tags.add(object_tag) self.mark_set("output_end", self.index("end-1c")) self._discard_old_content() self._update_visible_io(None) self._reset_ansi_attributes() self._io_cursor_offset = 0 self._insert_prompt() self._try_submit_input( ) # Trying to submit leftover code (eg. second magic command) self.see("end")
def handle_toplevel_response(self, msg: ToplevelResponse) -> None: # Can be called by event system or by Workbench # (if Assistant wasn't created yet but an error came) if not msg.get("user_exception") and msg.get("command_name") in [ "execute_system_command", "execute_source", ]: # Shell commands may be used to investigate the problem, don't clear assistance return self._clear() from thonny.plugins.cpython import CPythonProxy if not isinstance(get_runner().get_backend_proxy(), CPythonProxy): # TODO: add some support for MicroPython as well return # prepare for snapshot key = msg.get("filename", "<pyshell>") self._current_snapshot = { "timestamp": datetime.datetime.now().isoformat()[:19], "main_file_path": key, } self._snapshots_per_main_file.setdefault(key, []) self._snapshots_per_main_file[key].append(self._current_snapshot) if msg.get("user_exception"): if not msg["user_exception"].get("message", None): msg["user_exception"]["message"] = "<no message>" self._exception_info = msg["user_exception"] self._explain_exception(msg["user_exception"]) if get_workbench().get_option( "assistance.open_assistant_on_errors"): get_workbench().show_view("AssistantView", set_focus=False) else: self._exception_info = None if msg.get("filename") and os.path.exists(msg["filename"]): self.main_file_path = msg["filename"] source = read_source(msg["filename"]) self._start_program_analyses( msg["filename"], source, _get_imported_user_files(msg["filename"], source)) else: self.main_file_path = None self._present_conclusion()