()
| 27 | |
| 28 | |
| 29 | def gui(): |
| 30 | # NOTE: 界面初始化前完成日志初始化与权限校验;日志路径用于导出功能 |
| 31 | log_path = setup_logging() |
| 32 | log_event(logging.INFO, "ui_init", "GUI 初始化开始", action="gui_init", status="started") |
| 33 | if not is_admin(): |
| 34 | log_event(logging.INFO, "ui_admin_required", "检测到非管理员权限,准备提权", action="gui_init", status="required") |
| 35 | messagebox.showinfo("提示", "需要管理员权限运行") |
| 36 | run_as_admin() |
| 37 | |
| 38 | root = tk.Tk() |
| 39 | root.title("Windows 更新管理") |
| 40 | try: |
| 41 | icon_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), "windows.ico") |
| 42 | root.iconbitmap(icon_path) |
| 43 | except Exception: |
| 44 | pass |
| 45 | root.geometry("550x550") |
| 46 | x, y = (root.winfo_screenwidth() - 550) // 2, (root.winfo_screenheight() - 550) // 2 |
| 47 | root.geometry(f"550x550+{x}+{y}") |
| 48 | root.resizable(False, False) |
| 49 | root.minsize(550, 560) |
| 50 | root.maxsize(550, 560) |
| 51 | ttk.Style().theme_use("vista") |
| 52 | |
| 53 | # NOTE: 单页简化界面:顶部操作区 + 两个功能区(更新、Defender) |
| 54 | topbar = ttk.Frame(root) |
| 55 | topbar.pack(fill=tk.X, padx=10, pady=10) |
| 56 | ttk.Button(topbar, text="检查更新", command=_check_update).pack(side=tk.RIGHT) |
| 57 | ttk.Button(topbar, text="导出日志", command=lambda: _export_logs(log_path)).pack(side=tk.RIGHT, padx=10) |
| 58 | |
| 59 | content = ttk.Frame(root) |
| 60 | content.pack(fill=tk.BOTH, expand=True) |
| 61 | |
| 62 | ttk.Label(content, text="暂停 Windows 更新", font=("Microsoft YaHei", 14)).pack(pady=10) |
| 63 | f1 = ttk.Frame(content) |
| 64 | f1.pack(pady=4) |
| 65 | |
| 66 | selector = TimeRangeSelector(f1) |
| 67 | selector.pack(pady=6) |
| 68 | |
| 69 | def _pause_with_selector(): |
| 70 | action = "pause_updates_with_times" |
| 71 | op_id = new_op_id() |
| 72 | token = set_op_id(op_id) |
| 73 | started = time.perf_counter() |
| 74 | log_event(logging.INFO, "ui_action_started", "用户点击暂停更新", action=action, status="started") |
| 75 | try: |
| 76 | sdt, preset_days, edt, is_custom = selector.get_values() |
| 77 | except ValueError as e: |
| 78 | log_event( |
| 79 | logging.ERROR, |
| 80 | "ui_action_validation_failed", |
| 81 | f"暂停更新参数校验失败: {e}", |
| 82 | action=action, |
| 83 | status="failed", |
| 84 | error_type=type(e).__name__, |
| 85 | error_message=str(e), |
| 86 | ) |
no test coverage detected