# -*- coding: utf-8 -*- """锁屏时给出人话提示。 实测: 电脑锁屏时 ImageGrab.grab() 抛 OSError("screen grab failed"), 原来的报错就是原样透传"抓屏失败: screen grab failed" —— 用户看了不知道该怎么办。 改成: 检测到是这个原因时,直接说"电脑锁屏了(或没有桌面会话), 请先解锁屏幕再试"。 顺便:这是**常见情况**(人离开电脑就会锁),不是异常。 """ from __future__ import annotations import sys from pathlib import Path SCREEN = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\windows" r"\lanremote\screen.py") OLD = ''' with self._lock: try: image = ImageGrab.grab() except Exception as exc: # noqa: BLE001 raise ScreenError(f"抓屏失败: {exc}") from exc''' NEW = ''' with self._lock: try: image = ImageGrab.grab() except Exception as exc: # noqa: BLE001 raise ScreenError(_grab_error_text(exc)) from exc''' HELPER_ANCHOR = '''class ScreenCapturer:''' HELPER_NEW = '''def _grab_error_text(error: Exception) -> str: """把抓屏失败翻译成人话。 锁屏是最常见的失败原因(离开电脑就会锁), 而且 Windows 锁屏时**不给抓屏**,报的是 OSError: screen grab failed。 直接透传这句用户看不懂,所以这里给出可操作的提示。 """ text = str(error).lower() if "screen grab failed" in text or "grab" in text: return ("抓屏失败:电脑现在锁屏了(或没有桌面会话)。" "请先解锁屏幕再试。") return f"抓屏失败: {error}" ''' + HELPER_ANCHOR def main() -> int: text = SCREEN.read_text(encoding="utf-8") if "_grab_error_text" in text: print(" 已经改过") return 0 ok = True for old, new, label in ((HELPER_ANCHOR, HELPER_NEW, "加提示函数"), (OLD, NEW, "用提示函数")): if old not in text: print(f" [失败] {label} —— 锚点没找到") ok = False continue text = text.replace(old, new, 1) print(f" {label}") SCREEN.write_text(text, encoding="utf-8", newline="\n") import ast try: ast.parse(text) print(" screen.py 语法 OK") except SyntaxError as exc: print(f" screen.py 语法错误: 行 {exc.lineno}: {exc.msg}") ok = False return 0 if ok else 1 if __name__ == "__main__": sys.exit(main())