# -*- coding: utf-8 -*- """修:关全屏窗口时没有回到 Tk 线程。 Tk 的对象只能在创建它的线程里操作。_close_fullscreen_windows 直接调 closer() -> win.destroy(),而它是在调用方线程(服务端线程)里跑的, 所以 destroy 静默失败 —— 全屏大字关不掉。 正确做法是走 ui.ui_call(),把那批 closer 排到 Tk 线程上执行。 """ from __future__ import annotations import sys from pathlib import Path FEATURES = Path(r"C:\Users\shu\Desktop\deepseekagent\LanRemote\windows" r"\lanremote\features.py") OLD = ''' def _close_fullscreen_windows(self) -> int: """关掉所有由本程序开的全屏窗口。""" closed = 0 for closer in list(getattr(self, "_fullscreen_closers", [])): try: closer() closed += 1 except Exception: # noqa: BLE001 pass self._fullscreen_closers = [] return closed''' NEW = ''' def _close_fullscreen_windows(self) -> int: """关掉所有由本程序开的全屏窗口。 注意:**必须回到 Tk 线程去 destroy**。Tk 的对象只能在创建它的 线程里操作,直接在服务端线程里调 win.destroy() 会静默失败, 表现成"全屏大字关不掉"。 """ closers = list(getattr(self, "_fullscreen_closers", [])) self._fullscreen_closers = [] if not closers: return 0 def run_all(): for closer in closers: try: closer() except Exception: # noqa: BLE001 pass ui = getattr(self.actions, "ui", None) if ui is not None: try: ui.ui_call(run_all) return len(closers) except Exception: # noqa: BLE001 pass # 界面拿不到(或超时)才退回直接调,至少试一下 closed = 0 for closer in closers: try: closer() closed += 1 except Exception: # noqa: BLE001 pass return closed''' def main() -> int: text = FEATURES.read_text(encoding="utf-8") if OLD not in text: print(" [失败] 锚点没找到") return 1 FEATURES.write_text(text.replace(OLD, NEW, 1), encoding="utf-8") print(" _close_fullscreen_windows 现在回到 Tk 线程执行") import ast try: ast.parse(FEATURES.read_text(encoding="utf-8")) print(" features.py: 语法 OK") except SyntaxError as exc: print(f" features.py: 语法错误 {exc}") return 1 return 0 if __name__ == "__main__": sys.exit(main())