diff --git a/src/gui/widgets.py b/src/gui/widgets.py index 456d060..c29a824 100644 --- a/src/gui/widgets.py +++ b/src/gui/widgets.py @@ -1079,7 +1079,7 @@ class UartMonitorWindow(ctk.CTkToplevel): ser.close() self.after(0, self._on_open_success) except Exception as e: - self.after(0, lambda: self._show_unavailable(str(e))) + self.after(0, lambda e=e: self._show_unavailable(str(e))) threading.Thread(target=_bg_open, daemon=True).start() diff --git a/src/vitis_checker.py b/src/vitis_checker.py index 683a969..bb241cf 100644 --- a/src/vitis_checker.py +++ b/src/vitis_checker.py @@ -324,7 +324,7 @@ def _get_tool_version(tool_path: str) -> str: """Get the version string from a tool executable. Tries (in order): - 1. tool -version + 1. tool -version → parse version from output 2. Extract from path (e.g., .../Vitis/2023.2/bin/xsct → 2023.2) Args: @@ -343,14 +343,17 @@ def _get_tool_version(tool_path: str) -> str: ) output = (result.stdout + result.stderr).strip() if output: - # Look for a version pattern in output - m = re.search(r"(\d{4}\.\d+(?:\.\d+)?)", output) - if m: - return m.group(1) - # Return first meaningful line (truncated) - line = output.split("\n")[0][:80] - if line and "usage" not in line.lower(): - return line + # Scan all lines for a version pattern (skip batch echo noise) + for raw_line in output.splitlines(): + line = raw_line.strip() + if not line: + continue + # Skip Windows batch echo noise + if _is_batch_noise(line): + continue + m = re.search(r"(\d{4}\.\d+(?:\.\d+)?)", line) + if m: + return m.group(1) except (subprocess.TimeoutExpired, OSError): pass @@ -358,6 +361,22 @@ def _get_tool_version(tool_path: str) -> str: return _version_from_path(tool_path) +def _is_batch_noise(line: str) -> bool: + """Check if a line is Windows batch script noise. + + Args: + line: A line of output text. + + Returns: + True if the line looks like batch echo/status noise. + """ + noise_patterns = [ + r"^ECHO\s+(is\s+(on|off)|处于)", # ECHO is on/off (en+zh) + r"^[A-Z]:\\[^>]*>", # Prompt line like C:\path> + ] + return any(re.search(p, line, re.IGNORECASE) for p in noise_patterns) + + # ── Main check function ──────────────────────────────────────────────