{"id":3251,"date":"2025-06-20T06:46:13","date_gmt":"2025-06-19T22:46:13","guid":{"rendered":"https:\/\/blog.kangyue.pro\/?p=3251"},"modified":"2025-07-25T13:36:41","modified_gmt":"2025-07-25T05:36:41","slug":"%e4%b8%80%e6%ac%be%e5%ae%9a%e6%97%b6%e7%9d%a1%e7%9c%a0-%e5%85%b3%e6%9c%ba%e5%b0%8f%e5%b7%a5%e5%85%b7-%e7%94%b1chatgpt%e7%94%9f%e6%88%90python%e7%9a%84%e7%a8%8b%e5%ba%8f","status":"publish","type":"post","link":"https:\/\/blog.kangyue.pro\/?p=3251","title":{"rendered":"\u4e00\u6b3e\u5b9a\u65f6\u7761\u7720\/\u5173\u673a\u5c0f\u5de5\u5177\u2014\u2014\u7531ChatGPT\u751f\u6210Python\u7a0b\u5e8f"},"content":{"rendered":"\n<h1 class=\"wp-block-heading has-text-align-center\">Windows7<\/h1>\n\n\n\n<h3 class=\"wp-block-heading\">2025.7\u7248\u672c<\/h3>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-1d45ef57-4e33-4a27-abf6-fa92350946ff\" href=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/07\/\u81ea\u52a8\u7761\u7720.exe\">\u81ea\u52a8\u7761\u7720<\/a><a href=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/07\/\u81ea\u52a8\u7761\u7720.exe\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-1d45ef57-4e33-4a27-abf6-fa92350946ff\">\u4e0b\u8f7d<\/a><\/div>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"583\" height=\"303\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-172.png\" alt=\"\" class=\"wp-image-3570\"\/><\/figure>\n\n\n\t\t<div class='wp-block-bch-code-highlight  align' id='bhcCodeHighlight-7f37d7d2-a' data-attributes='{&quot;cId&quot;:&quot;7f37d7d2-a&quot;,&quot;language&quot;:&quot;python&quot;,&quot;code&quot;:&quot;import tkinter as tk\\nfrom tkinter import messagebox\\nimport threading\\nimport time\\nimport os\\nimport winsound\\n\\nclass CreateToolTip(object):\\n    \\&quot;\\&quot;\\&quot;\\n    \\u81ea\\u5b9a\\u4e49\\u60ac\\u6d6e\\u63d0\\u793a\\u7c7b\\n    \\&quot;\\&quot;\\&quot;\\n    def __init__(self, widget, text=&#039;widget info&#039;):\\n        self.widget = widget\\n        self.text = text\\n        self.tipwindow = None\\n        self.id = None\\n        self.x = self.y = 0\\n        widget.bind(&#039;&lt;Enter&gt;&#039;, self.enter)\\n        widget.bind(&#039;&lt;Leave&gt;&#039;, self.leave)\\n\\n    def enter(self, event=None):\\n        self.schedule()\\n\\n    def leave(self, event=None):\\n        self.unschedule()\\n        self.hidetip()\\n\\n    def schedule(self):\\n        self.unschedule()\\n        self.id = self.widget.after(500, self.showtip)  # 500\\u6beb\\u79d2\\u540e\\u663e\\u793a\\u63d0\\u793a\\n\\n    def unschedule(self):\\n        id_ = self.id\\n        self.id = None\\n        if id_:\\n            self.widget.after_cancel(id_)\\n\\n    def showtip(self, event=None):\\n        if self.tipwindow or not self.text:\\n            return\\n        x, y, cx, cy = self.widget.bbox(\\&quot;insert\\&quot;)\\n        x = x + self.widget.winfo_rootx() + 25\\n        y = y + cy + self.widget.winfo_rooty() + 20\\n        self.tipwindow = tw = tk.Toplevel(self.widget)\\n        tw.wm_overrideredirect(True)  # \\u65e0\\u8fb9\\u6846\\n        tw.wm_geometry(\\&quot;+%d+%d\\&quot; % (x, y))\\n        label = tk.Label(tw, text=self.text, justify=&#039;left&#039;,\\n                         background=\\&quot;#ffffe0\\&quot;, relief=&#039;solid&#039;, borderwidth=1,\\n                         font=(\\&quot;\\u5b8b\\u4f53\\&quot;, 12))\\n        label.pack(ipadx=5, ipady=2)\\n\\n    def hidetip(self):\\n        tw = self.tipwindow\\n        self.tipwindow = None\\n        if tw:\\n            tw.destroy()\\n\\nclass TimerApp:\\n    def __init__(self, root):\\n        self.root = root\\n        self.root.title(\\&quot;\\u5b9a\\u65f6\\u7761\\u7720 \\\/ \\u5173\\u673a - \\u652f\\u6301 Win7\\&quot;)\\n        self.root.geometry(\\&quot;360x270\\&quot;)  # \\u9002\\u5f53\\u589e\\u52a0\\u9ad8\\u5ea6\\u5bb9\\u7eb3\\u4e24\\u4e2a\\u65b0\\u6309\\u94ae\\n        self.root.resizable(False, False)\\n\\n        self.timer_thread = None\\n        self.should_stop = False\\n        self.remaining_seconds = 0\\n        self.running = False\\n\\n        self.build_ui()\\n\\n    def build_ui(self):\\n        font_label = (\\&quot;\\u5b8b\\u4f53\\&quot;, 12)\\n        font_input = (\\&quot;\\u5b8b\\u4f53\\&quot;, 12)\\n        font_timer = (\\&quot;\\u5b8b\\u4f53\\&quot;, 12)\\n\\n        main_frame = tk.Frame(self.root, padx=10, pady=10)\\n        main_frame.pack(fill=\\&quot;both\\&quot;, expand=True)\\n\\n        # \\u8f93\\u5165\\u65f6\\u95f4\\n        input_frame = tk.Frame(main_frame)\\n        input_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(input_frame, text=\\&quot;\\u8bf7\\u8f93\\u5165\\u5012\\u8ba1\\u65f6\\u65f6\\u95f4\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.entry = tk.Entry(input_frame, width=10, font=font_input)\\n        self.entry.insert(0, \\&quot;10\\&quot;)\\n        self.entry.pack(side=\\&quot;left\\&quot;, padx=5)\\n\\n        # \\u65f6\\u95f4\\u5355\\u4f4d\\n        unit_frame = tk.Frame(main_frame)\\n        unit_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(unit_frame, text=\\&quot;\\u65f6\\u95f4\\u5355\\u4f4d\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.unit_var = tk.StringVar(value=\\&quot;\\u5206\\u949f\\&quot;)\\n        for unit in [\\&quot;\\u79d2\\&quot;, \\&quot;\\u5206\\u949f\\&quot;, \\&quot;\\u5c0f\\u65f6\\&quot;]:\\n            tk.Radiobutton(unit_frame, text=unit, variable=self.unit_var, value=unit, font=font_label).pack(side=\\&quot;left\\&quot;, padx=3)\\n\\n        # \\u64cd\\u4f5c\\u7c7b\\u578b\\n        action_frame = tk.Frame(main_frame)\\n        action_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(action_frame, text=\\&quot;\\u64cd\\u4f5c\\u7c7b\\u578b\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.action_var = tk.StringVar(value=\\&quot;\\u7761\\u7720\\&quot;)\\n        tk.Radiobutton(action_frame, text=\\&quot;\\u7761\\u7720\\&quot;, variable=self.action_var, value=\\&quot;\\u7761\\u7720\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;, padx=5)\\n        tk.Radiobutton(action_frame, text=\\&quot;\\u5173\\u673a\\&quot;, variable=self.action_var, value=\\&quot;\\u5173\\u673a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;, padx=5)\\n\\n        # \\u63d0\\u793a\\u97f3\\u8bbe\\u7f6e\\n        sound_frame = tk.Frame(main_frame)\\n        sound_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(sound_frame, text=\\&quot;\\u63d0\\u793a\\u97f3\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.sound_mode = tk.StringVar(value=\\&quot;\\u65e0\\&quot;)  # \\u9ed8\\u8ba4\\u65e0\\u63d0\\u793a\\u97f3\\n        for mode in [\\&quot;\\u65e0\\&quot;, \\&quot;\\u4e00\\u6b21\\&quot;, \\&quot;\\u6301\\u7eed\\&quot;]:\\n            tk.Radiobutton(sound_frame, text=mode, variable=self.sound_mode, value=mode, font=font_label).pack(side=\\&quot;left\\&quot;, padx=3)\\n\\n        # \\u95ee\\u53f7\\u63d0\\u793a\\u56fe\\u6807\\n        help_label = tk.Label(sound_frame, text=\\&quot;\\u2753\\&quot;, font=(\\&quot;\\u5b8b\\u4f53\\&quot;, 12), fg=\\&quot;blue\\&quot;, cursor=\\&quot;hand2\\&quot;)\\n        help_label.pack(side=\\&quot;left\\&quot;, padx=5)\\n\\n        tooltip_text = (\\n            \\&quot;\\u63d0\\u793a\\u97f3\\u9009\\u9879\\u8bf4\\u660e\\uff1a\\\\n\\&quot;\\n            \\&quot;\\u65e0\\uff1a\\u5173\\u95ed\\u63d0\\u793a\\u97f3\\\\n\\&quot;\\n            \\&quot;\\u4e00\\u6b21\\uff1a\\u5012\\u8ba1\\u65f6\\u6700\\u540e15\\u79d2\\u65f6\\uff0c\\u54cd\\u4e00\\u58f0\\\\n\\&quot;\\n            \\&quot;\\u6301\\u7eed\\uff1a\\u5012\\u8ba1\\u65f6\\u6700\\u540e15\\u79d2\\u8d77\\uff0c\\u6bcf\\u79d2\\u54cd\\u4e00\\u58f0\\&quot;\\n        )\\n        CreateToolTip(help_label, tooltip_text)\\n\\n        # \\u63a7\\u5236\\u6309\\u94ae\\n        self.control_button = tk.Button(main_frame, text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;, command=self.toggle_timer, font=(\\&quot;\\u5b8b\\u4f53\\&quot;, 12), width=20)\\n        self.control_button.pack(pady=10)\\n\\n        # \\u5012\\u8ba1\\u65f6\\u663e\\u793a\\n        self.countdown_label = tk.Label(main_frame, text=\\&quot;\\&quot;, font=font_timer, fg=\\&quot;red\\&quot;)\\n        self.countdown_label.pack(pady=5)\\n\\n        # \\u2014\\u2014 \\u65b0\\u589e\\u4e24\\u4e2a\\u7acb\\u5373\\u6267\\u884c\\u6309\\u94ae \\u2014\\u2014 \\n        btn_frame = tk.Frame(main_frame)\\n        btn_frame.pack(pady=5)\\n\\n        self.immediate_sleep_btn = tk.Button(btn_frame, text=\\&quot;\\u7acb\\u5373\\u7761\\u7720\\&quot;, font=(\\&quot;\\u5b8b\\u4f53\\&quot;, 12), width=12, command=self.sleep)\\n        self.immediate_sleep_btn.pack(side=\\&quot;left\\&quot;, padx=10)\\n\\n        self.immediate_shutdown_btn = tk.Button(btn_frame, text=\\&quot;\\u7acb\\u5373\\u5173\\u673a\\&quot;, font=(\\&quot;\\u5b8b\\u4f53\\&quot;, 12), width=12, command=self.shutdown)\\n        self.immediate_shutdown_btn.pack(side=\\&quot;left\\&quot;, padx=10)\\n\\n    def toggle_timer(self):\\n        if not self.running:\\n            seconds = self.convert_to_seconds(self.entry.get(), self.unit_var.get())\\n            if seconds is None:\\n                messagebox.showerror(\\&quot;\\u8f93\\u5165\\u9519\\u8bef\\&quot;, \\&quot;\\u8bf7\\u8f93\\u5165\\u4e00\\u4e2a\\u6709\\u6548\\u7684\\u6b63\\u6570\\u65f6\\u95f4\\&quot;)\\n                return\\n\\n            self.remaining_seconds = seconds\\n            self.should_stop = False\\n            self.running = True\\n            self.control_button.config(text=\\&quot;\\u53d6\\u6d88\\u5012\\u8ba1\\u65f6\\&quot;)\\n            self.timer_thread = threading.Thread(target=self.run_timer, daemon=True)\\n            self.timer_thread.start()\\n        else:\\n            self.should_stop = True\\n            self.running = False\\n            self.control_button.config(text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;)\\n            self.countdown_label.config(text=\\&quot;\\u5df2\\u53d6\\u6d88\\&quot;)\\n\\n    def convert_to_seconds(self, value, unit):\\n        try:\\n            num = float(value)\\n            if num &lt;= 0:\\n                raise ValueError\\n            if unit == \\&quot;\\u5c0f\\u65f6\\&quot;:\\n                return int(num * 3600)\\n            elif unit == \\&quot;\\u5206\\u949f\\&quot;:\\n                return int(num * 60)\\n            else:\\n                return int(num)\\n        except ValueError:\\n            return None\\n\\n    def run_timer(self):\\n        while self.remaining_seconds &gt; 0 and not self.should_stop:\\n            mins, secs = divmod(self.remaining_seconds, 60)\\n            self.countdown_label.config(text=f\\&quot;\\u5012\\u8ba1\\u65f6\\uff1a{mins:02d}:{secs:02d}\\&quot;)\\n\\n            # \\u64ad\\u653e\\u63d0\\u793a\\u97f3\\uff0c\\u6839\\u636e\\u6a21\\u5f0f\\n            if self.sound_mode.get() == \\&quot;\\u6301\\u7eed\\&quot; and self.remaining_seconds &lt;= 15:\\n                self.play_warning_sound()\\n            elif self.sound_mode.get() == \\&quot;\\u4e00\\u6b21\\&quot; and self.remaining_seconds == 15:\\n                self.play_warning_sound()\\n\\n            self.remaining_seconds -= 1\\n            time.sleep(1)\\n\\n        if not self.should_stop:\\n            self.countdown_label.config(text=\\&quot;\\u6b63\\u5728\\u6267\\u884c\\u64cd\\u4f5c...\\&quot;)\\n            action = self.action_var.get()\\n            if action == \\&quot;\\u5173\\u673a\\&quot;:\\n                self.shutdown()\\n            elif action == \\&quot;\\u7761\\u7720\\&quot;:\\n                self.sleep()\\n\\n        self.control_button.config(text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;)\\n        self.running = False\\n\\n    def shutdown(self):\\n        os.system(\\&quot;shutdown \\\/s \\\/t 0\\&quot;)\\n\\n    def sleep(self):\\n        os.system(\\&quot;rundll32.exe powrprof.dll,SetSuspendState Sleep\\&quot;)\\n\\n    def play_warning_sound(self):\\n        try:\\n            winsound.Beep(1000, 200)  # \\u54cd\\u4e00\\u58f0\\n        except:\\n            pass\\n\\nif __name__ == \\&quot;__main__\\&quot;:\\n    root = tk.Tk()\\n    app = TimerApp(root)\\n    root.mainloop()\\n&quot;,&quot;codeTypo&quot;:{&quot;desktop&quot;:9,&quot;tablet&quot;:15,&quot;mobile&quot;:14},&quot;align&quot;:&quot;&quot;,&quot;lineNumbers&quot;:true,&quot;theme&quot;:&quot;default&quot;,&quot;clipBoard&quot;:true,&quot;wordWrap&quot;:true,&quot;width&quot;:{&quot;desktop&quot;:&quot;100%&quot;,&quot;tablet&quot;:&quot;100%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;height&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;padding&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;background&quot;:{&quot;color&quot;:&quot;#d3cfcf42&quot;},&quot;layout&quot;:{&quot;align&quot;:&quot;left&quot;},&quot;border&quot;:{&quot;color&quot;:&quot;#000&quot;,&quot;style&quot;:&quot;solid&quot;,&quot;width&quot;:&quot;0px&quot;},&quot;shadow&quot;:[],&quot;alignment&quot;:&quot;center&quot;,&quot;clipBoardColors&quot;:{&quot;color&quot;:&quot;#fff&quot;,&quot;bg&quot;:&quot;#00000024&quot;}}'><\/div>\r\n\r\n\t\t\n\n\n<h3 class=\"wp-block-heading\">2025.6\u7248<\/h3>\n\n\n\n<p>\u63d0\u793a\uff1a\u5305\u542b\u4e2d\u6587\u7684Python\u4ee3\u7801\u8981\u4ee5UTF-8\u7684\u7f16\u7801\u4fdd\u5b58\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"366\" height=\"305\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-157.png\" alt=\"\" class=\"wp-image-3402\"\/><\/figure>\n\n\n\t\t<div class='wp-block-bch-code-highlight  align' id='bhcCodeHighlight-8209e045-3' data-attributes='{&quot;cId&quot;:&quot;8209e045-3&quot;,&quot;language&quot;:&quot;python&quot;,&quot;code&quot;:&quot;import tkinter as tk\\nfrom tkinter import messagebox\\nimport threading\\nimport time\\nimport os\\nimport winsound\\n\\nclass TimerApp:\\n    def __init__(self, root):\\n        self.root = root\\n        self.root.title(\\&quot;\\u5b9a\\u65f6\\u7761\\u7720 \\\/ \\u5173\\u673a - \\u652f\\u6301 Win7\\&quot;)\\n        self.root.geometry(\\&quot;360x280\\&quot;)\\n        self.root.resizable(False, False)\\n\\n        self.timer_thread = None\\n        self.should_stop = False\\n        self.remaining_seconds = 0\\n        self.running = False\\n\\n        self.build_ui()\\n\\n    def build_ui(self):\\n        font_label = (\\&quot;\\u5fae\\u8f6f\\u96c5\\u9ed1\\&quot;, 10)\\n        font_input = (\\&quot;\\u5e7c\\u5706\\&quot;, 12)\\n        font_timer = (\\&quot;\\u5e7c\\u5706\\&quot;, 18)\\n\\n        main_frame = tk.Frame(self.root, padx=10, pady=10)\\n        main_frame.pack(fill=\\&quot;both\\&quot;, expand=True)\\n\\n        # \\u8f93\\u5165\\u65f6\\u95f4\\n        input_frame = tk.Frame(main_frame)\\n        input_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(input_frame, text=\\&quot;\\u8bf7\\u8f93\\u5165\\u5012\\u8ba1\\u65f6\\u65f6\\u95f4\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.entry = tk.Entry(input_frame, width=10, font=font_input)\\n        self.entry.insert(0, \\&quot;10\\&quot;)\\n        self.entry.pack(side=\\&quot;left\\&quot;, padx=5)\\n\\n        # \\u65f6\\u95f4\\u5355\\u4f4d\\n        unit_frame = tk.Frame(main_frame)\\n        unit_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(unit_frame, text=\\&quot;\\u65f6\\u95f4\\u5355\\u4f4d\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.unit_var = tk.StringVar(value=\\&quot;\\u5206\\u949f\\&quot;)\\n        for unit in [\\&quot;\\u79d2\\&quot;, \\&quot;\\u5206\\u949f\\&quot;, \\&quot;\\u5c0f\\u65f6\\&quot;]:\\n            tk.Radiobutton(unit_frame, text=unit, variable=self.unit_var, value=unit, font=font_label).pack(side=\\&quot;left\\&quot;, padx=3)\\n\\n        # \\u64cd\\u4f5c\\u7c7b\\u578b\\n        action_frame = tk.Frame(main_frame)\\n        action_frame.pack(pady=5, anchor=\\&quot;w\\&quot;)\\n        tk.Label(action_frame, text=\\&quot;\\u64cd\\u4f5c\\u7c7b\\u578b\\uff1a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;)\\n        self.action_var = tk.StringVar(value=\\&quot;\\u7761\\u7720\\&quot;)\\n        tk.Radiobutton(action_frame, text=\\&quot;\\u7761\\u7720\\&quot;, variable=self.action_var, value=\\&quot;\\u7761\\u7720\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;, padx=5)\\n        tk.Radiobutton(action_frame, text=\\&quot;\\u5173\\u673a\\&quot;, variable=self.action_var, value=\\&quot;\\u5173\\u673a\\&quot;, font=font_label).pack(side=\\&quot;left\\&quot;, padx=5)\\n\\n        # \\u63a7\\u5236\\u6309\\u94ae\\n        self.control_button = tk.Button(main_frame, text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;, command=self.toggle_timer, font=(\\&quot;\\u5fae\\u8f6f\\u96c5\\u9ed1\\&quot;, 11), width=20)\\n        self.control_button.pack(pady=15)\\n\\n        # \\u5012\\u8ba1\\u65f6\\u663e\\u793a\\uff08\\u7ea2\\u8272 + \\u5e7c\\u5706\\u5b57\\u4f53\\uff09\\n        self.countdown_label = tk.Label(main_frame, text=\\&quot;\\&quot;, font=font_timer, fg=\\&quot;red\\&quot;)\\n        self.countdown_label.pack(pady=5)\\n\\n    def toggle_timer(self):\\n        if not self.running:\\n            seconds = self.convert_to_seconds(self.entry.get(), self.unit_var.get())\\n            if seconds is None:\\n                messagebox.showerror(\\&quot;\\u8f93\\u5165\\u9519\\u8bef\\&quot;, \\&quot;\\u8bf7\\u8f93\\u5165\\u4e00\\u4e2a\\u6709\\u6548\\u7684\\u6b63\\u6570\\u65f6\\u95f4\\&quot;)\\n                return\\n\\n            self.remaining_seconds = seconds\\n            self.should_stop = False\\n            self.running = True\\n            self.control_button.config(text=\\&quot;\\u53d6\\u6d88\\u5012\\u8ba1\\u65f6\\&quot;)\\n            self.timer_thread = threading.Thread(target=self.run_timer, daemon=True)\\n            self.timer_thread.start()\\n        else:\\n            self.should_stop = True\\n            self.running = False\\n            self.control_button.config(text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;)\\n            self.countdown_label.config(text=\\&quot;\\u5df2\\u53d6\\u6d88\\&quot;)\\n\\n    def convert_to_seconds(self, value, unit):\\n        try:\\n            num = float(value)\\n            if num &lt;= 0:\\n                raise ValueError\\n            if unit == \\&quot;\\u5c0f\\u65f6\\&quot;:\\n                return int(num * 3600)\\n            elif unit == \\&quot;\\u5206\\u949f\\&quot;:\\n                return int(num * 60)\\n            else:\\n                return int(num)\\n        except ValueError:\\n            return None\\n\\n    def run_timer(self):\\n        while self.remaining_seconds &gt; 0 and not self.should_stop:\\n            mins, secs = divmod(self.remaining_seconds, 60)\\n            self.countdown_label.config(text=f\\&quot;\\u5012\\u8ba1\\u65f6\\uff1a{mins:02d}:{secs:02d}\\&quot;)\\n\\n            if self.remaining_seconds &lt;= 15:\\n                self.play_warning_sound()\\n\\n            self.remaining_seconds -= 1\\n            time.sleep(1)\\n\\n        if not self.should_stop:\\n            self.countdown_label.config(text=\\&quot;\\u6b63\\u5728\\u6267\\u884c\\u64cd\\u4f5c...\\&quot;)\\n            action = self.action_var.get()\\n            if action == \\&quot;\\u5173\\u673a\\&quot;:\\n                self.shutdown()\\n            elif action == \\&quot;\\u7761\\u7720\\&quot;:\\n                self.sleep()\\n\\n        self.control_button.config(text=\\&quot;\\u5f00\\u59cb\\u5012\\u8ba1\\u65f6\\&quot;)\\n        self.running = False\\n\\n    def shutdown(self):\\n        os.system(\\&quot;shutdown \\\/s \\\/t 0\\&quot;)\\n\\n    def sleep(self):\\n        os.system(\\&quot;rundll32.exe powrprof.dll,SetSuspendState Sleep\\&quot;)\\n\\n    def play_warning_sound(self):\\n        try:\\n            winsound.Beep(1000, 200)  # \\u54cd\\u4e00\\u58f0\\n        except:\\n            pass\\n\\nif __name__ == \\&quot;__main__\\&quot;:\\n    root = tk.Tk()\\n    app = TimerApp(root)\\n    root.mainloop()\\n&quot;,&quot;codeTypo&quot;:{&quot;desktop&quot;:9,&quot;tablet&quot;:15,&quot;mobile&quot;:14},&quot;height&quot;:{&quot;desktop&quot;:&quot;300px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;align&quot;:&quot;&quot;,&quot;lineNumbers&quot;:true,&quot;theme&quot;:&quot;default&quot;,&quot;clipBoard&quot;:true,&quot;wordWrap&quot;:true,&quot;width&quot;:{&quot;desktop&quot;:&quot;100%&quot;,&quot;tablet&quot;:&quot;100%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;padding&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;background&quot;:{&quot;color&quot;:&quot;#d3cfcf42&quot;},&quot;layout&quot;:{&quot;align&quot;:&quot;left&quot;},&quot;border&quot;:{&quot;color&quot;:&quot;#000&quot;,&quot;style&quot;:&quot;solid&quot;,&quot;width&quot;:&quot;0px&quot;},&quot;shadow&quot;:[],&quot;alignment&quot;:&quot;center&quot;,&quot;clipBoardColors&quot;:{&quot;color&quot;:&quot;#fff&quot;,&quot;bg&quot;:&quot;#00000024&quot;}}'><\/div>\r\n\r\n\t\t\n\n\n<h1 class=\"wp-block-heading has-text-align-center\">Windows10\/11<\/h1>\n\n\n\n<h1 class=\"wp-block-heading\">\u9700\u6c42\u6e05\u5355<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u5b9a\u65f6<strong>\u7761\u7720<\/strong>\u6216<strong>\u5173\u673a<\/strong><\/li>\n\n\n\n<li><strong>\u8f93\u5165\u65f6\u95f4<\/strong>\u6216<strong>\u6307\u5b9a\u65f6\u95f4<\/strong><\/li>\n\n\n\n<li>\u663e\u793a\u5012\u8ba1\u65f6<\/li>\n\n\n\n<li><strong>\u58f0\u97f3\u63d0\u793a<\/strong>\n<ul class=\"wp-block-list\">\n<li>\u5269\u4f59\u65f6\u95f41\u5206\u949f\u65f6<strong>\u8bed\u97f3\u64ad\u62a5<\/strong><\/li>\n\n\n\n<li>\u5269\u4f59\u65f6\u95f410\u79d2\u949f\u65f6\u8702\u9e23\u63d0\u793a<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>\u6709\u5269\u4f59\u5012\u8ba1\u65f6\u7684\u63d0\u793a\u8bed\n<ul class=\"wp-block-list\">\n<li>\u4ec5\u6570\u5b57\u4ee3\u8868\u5206\u949f\uff0c\u598230<\/li>\n\n\n\n<li>\u6570\u5b57+h\u4ee3\u8868\u5c0f\u65f6\uff0c\u59821.5h<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h1 class=\"wp-block-heading\">\u6210\u54c1\u5de5\u5177<\/h1>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"422\" height=\"413\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-113.png\" alt=\"\" class=\"wp-image-3258\"\/><\/figure>\n\n\n\n<div class=\"wp-block-file\"><a id=\"wp-block-file--media-9256bfd6-e180-4beb-a155-a70f55b745f5\" href=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/\u81ea\u52a8\u5173\u673a\u548c\u7761\u7720.exe\">\u81ea\u52a8\u5173\u673a\u548c\u7761\u7720.exe<\/a><a href=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/\u81ea\u52a8\u5173\u673a\u548c\u7761\u7720.exe\" class=\"wp-block-file__button wp-element-button\" download aria-describedby=\"wp-block-file--media-9256bfd6-e180-4beb-a155-a70f55b745f5\">\u4e0b\u8f7d<\/a><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">\u5236\u4f5c\u8fc7\u7a0b<\/h1>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1604\" height=\"956\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-110.png\" alt=\"\" class=\"wp-image-3252\" srcset=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-110.png 1604w, https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-110-768x458.png 768w, https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-110-1536x915.png 1536w\" sizes=\"auto, (max-width: 1604px) 100vw, 1604px\" \/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">Python\u4ee3\u7801<\/h1>\n\n\n\t\t<div class='wp-block-bch-code-highlight  align' id='bhcCodeHighlight-95eb3804-1' data-attributes='{&quot;cId&quot;:&quot;95eb3804-1&quot;,&quot;language&quot;:&quot;python&quot;,&quot;code&quot;:&quot;import tkinter as tk\\nfrom tkinter import messagebox\\nimport os\\nimport time\\nimport threading\\nimport datetime\\nimport ctypes\\nimport sys\\n\\nclass ShutdownSchedulerApp:\\n    def __init__(self, root):\\n        self.root = root\\n        root.title(\\&quot;\\u5b9a\\u65f6\\u5173\\u673a \\\/ \\u7761\\u7720\\u5de5\\u5177\\&quot;)\\n        root.geometry(\\&quot;420x380\\&quot;)\\n        root.resizable(False, False)\\n\\n        self.action_var = tk.StringVar(value=\\&quot;sleep\\&quot;)\\n        self.timer_thread = None\\n        self.scheduled = False\\n        self.remaining_seconds = 0\\n\\n        font_main = (\\&quot;Arial\\&quot;, 12)\\n\\n        # \\u64cd\\u4f5c\\u9009\\u62e9\\n        tk.Label(root, text=\\&quot;\\u64cd\\u4f5c\\u7c7b\\u578b:\\&quot;, font=font_main).pack(pady=5)\\n        tk.Radiobutton(root, text=\\&quot;\\u5173\\u673a\\&quot;, variable=self.action_var, value=\\&quot;shutdown\\&quot;, font=font_main).pack()\\n        tk.Radiobutton(root, text=\\&quot;\\u7761\\u7720\\&quot;, variable=self.action_var, value=\\&quot;sleep\\&quot;, font=font_main).pack()\\n\\n        # \\u5ef6\\u65f6\\u8f93\\u5165\\n        tk.Label(root, text=\\&quot;\\u5ef6\\u8fdf\\uff08\\u5206\\u949f \\u6216 \\u5c0f\\u65f6\\uff0c\\u5982 30\\u6216 1.5h\\uff09:\\&quot;, font=font_main).pack(pady=5)\\n        self.delay_entry = tk.Entry(root, font=font_main)\\n        self.delay_entry.pack()\\n\\n        # \\u6216\\u5177\\u4f53\\u65f6\\u95f4\\u8f93\\u5165\\n        tk.Label(root, text=\\&quot;\\u6216\\u6307\\u5b9a\\u5177\\u4f53\\u65f6\\u95f4\\uff08\\u5982 22:30\\uff09:\\&quot;, font=font_main).pack(pady=5)\\n        self.time_entry = tk.Entry(root, font=font_main)\\n        self.time_entry.pack()\\n\\n        # \\u63a7\\u5236\\u6309\\u94ae\\n        self.start_button = tk.Button(root, text=\\&quot;\\u5f00\\u59cb\\u5b9a\\u65f6\\&quot;, command=self.schedule_action, font=font_main)\\n        self.start_button.pack(pady=10)\\n\\n        self.cancel_button = tk.Button(root, text=\\&quot;\\u53d6\\u6d88\\u5b9a\\u65f6\\&quot;, command=self.cancel_schedule, font=font_main, state=\\&quot;disabled\\&quot;)\\n        self.cancel_button.pack()\\n\\n        # \\u72b6\\u6001\\u663e\\u793a\\n        self.status_label = tk.Label(root, text=\\&quot;\\&quot;, fg=\\&quot;blue\\&quot;, font=font_main, wraplength=360, justify=\\&quot;left\\&quot;)\\n        self.status_label.pack(pady=10)\\n\\n        # \\u5012\\u8ba1\\u65f6\\u663e\\u793a\\n        self.countdown_label = tk.Label(root, text=\\&quot;\\&quot;, fg=\\&quot;red\\&quot;, font=(\\&quot;Arial\\&quot;, 14))\\n        self.countdown_label.pack(pady=10)\\n\\n    def schedule_action(self):\\n        delay_text = self.delay_entry.get().strip()\\n        time_text = self.time_entry.get().strip()\\n        self.remaining_seconds = 0\\n\\n        # \\u5ef6\\u8fdf\\u683c\\u5f0f\\n        if delay_text:\\n            try:\\n                if delay_text.endswith(\\&quot;h\\&quot;):\\n                    hours = float(delay_text[:-1])\\n                    self.remaining_seconds = int(hours * 3600)\\n                else:\\n                    self.remaining_seconds = int(float(delay_text) * 60)\\n            except:\\n                messagebox.showerror(\\&quot;\\u683c\\u5f0f\\u9519\\u8bef\\&quot;, \\&quot;\\u5ef6\\u65f6\\u8f93\\u5165\\u4e0d\\u5408\\u6cd5\\&quot;)\\n                return\\n        elif time_text:\\n            try:\\n                now = datetime.datetime.now()\\n                target = datetime.datetime.strptime(time_text, \\&quot;%H:%M\\&quot;).replace(\\n                    year=now.year, month=now.month, day=now.day\\n                )\\n                if target &lt;= now:\\n                    target += datetime.timedelta(days=1)\\n                delta = target - now\\n                self.remaining_seconds = int(delta.total_seconds())\\n            except:\\n                messagebox.showerror(\\&quot;\\u683c\\u5f0f\\u9519\\u8bef\\&quot;, \\&quot;\\u65f6\\u95f4\\u683c\\u5f0f\\u5e94\\u4e3a HH:MM\\&quot;)\\n                return\\n        else:\\n            messagebox.showerror(\\&quot;\\u8f93\\u5165\\u9519\\u8bef\\&quot;, \\&quot;\\u8bf7\\u81f3\\u5c11\\u8f93\\u5165\\u4e00\\u79cd\\u65f6\\u95f4\\&quot;)\\n            return\\n\\n        if self.remaining_seconds &lt;= 0:\\n            messagebox.showerror(\\&quot;\\u65f6\\u95f4\\u9519\\u8bef\\&quot;, \\&quot;\\u5fc5\\u987b\\u662f\\u672a\\u6765\\u65f6\\u95f4\\&quot;)\\n            return\\n\\n        self.scheduled = True\\n        self.status_label.config(text=f\\&quot;\\u5c06\\u5728 {self.remaining_seconds \\\/\\\/ 60} \\u5206 {self.remaining_seconds % 60} \\u79d2\\u540e\\u6267\\u884c {self.action_var.get().upper()} \\u64cd\\u4f5c\\&quot;)\\n        self.start_button.config(state=\\&quot;disabled\\&quot;)\\n        self.cancel_button.config(state=\\&quot;normal\\&quot;)\\n\\n        self.timer_thread = threading.Thread(target=self.run_timer, daemon=True)\\n        self.timer_thread.start()\\n        self.update_countdown()\\n\\n    def update_countdown(self):\\n        if self.scheduled and self.remaining_seconds &gt; 0:\\n            mins, secs = divmod(self.remaining_seconds, 60)\\n            self.countdown_label.config(text=f\\&quot;\\u5269\\u4f59\\u65f6\\u95f4: {mins:02d}:{secs:02d}\\&quot;)\\n            self.remaining_seconds -= 1\\n            self.root.after(1000, self.update_countdown)\\n        elif self.scheduled and self.remaining_seconds &lt;= 0:\\n            self.countdown_label.config(text=\\&quot;\\u6b63\\u5728\\u6267\\u884c...\\&quot;)\\n            self.execute_action()\\n\\n    def run_timer(self):\\n        while self.scheduled and self.remaining_seconds &gt; 0:\\n            time.sleep(1)\\n\\n    def execute_action(self):\\n        action = self.action_var.get()\\n        try:\\n            if action == \\&quot;shutdown\\&quot;:\\n                os.system(\\&quot;shutdown \\\/s \\\/t 0\\&quot;)\\n            elif action == \\&quot;sleep\\&quot;:\\n                # \\u9632\\u6b62\\u5524\\u9192\\n                ctypes.windll.PowrProf.SetSuspendState(False, True, False)\\n        except Exception as e:\\n            messagebox.showerror(\\&quot;\\u6267\\u884c\\u9519\\u8bef\\&quot;, str(e))\\n        self.root.quit()\\n        sys.exit()\\n\\n    def cancel_schedule(self):\\n        self.scheduled = False\\n        self.remaining_seconds = 0\\n        self.status_label.config(text=\\&quot;\\u5b9a\\u65f6\\u4efb\\u52a1\\u5df2\\u53d6\\u6d88\\&quot;)\\n        self.countdown_label.config(text=\\&quot;\\&quot;)\\n        self.start_button.config(state=\\&quot;normal\\&quot;)\\n        self.cancel_button.config(state=\\&quot;disabled\\&quot;)\\n\\nif __name__ == \\&quot;__main__\\&quot;:\\n    root = tk.Tk()\\n    app = ShutdownSchedulerApp(root)\\n    root.mainloop()\\n\\n&quot;,&quot;codeTypo&quot;:{&quot;desktop&quot;:9,&quot;tablet&quot;:15,&quot;mobile&quot;:14},&quot;height&quot;:{&quot;desktop&quot;:&quot;300px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;align&quot;:&quot;&quot;,&quot;lineNumbers&quot;:true,&quot;theme&quot;:&quot;default&quot;,&quot;clipBoard&quot;:true,&quot;wordWrap&quot;:true,&quot;width&quot;:{&quot;desktop&quot;:&quot;100%&quot;,&quot;tablet&quot;:&quot;100%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;padding&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;background&quot;:{&quot;color&quot;:&quot;#d3cfcf42&quot;},&quot;layout&quot;:{&quot;align&quot;:&quot;left&quot;},&quot;border&quot;:{&quot;color&quot;:&quot;#000&quot;,&quot;style&quot;:&quot;solid&quot;,&quot;width&quot;:&quot;0px&quot;},&quot;shadow&quot;:[],&quot;alignment&quot;:&quot;center&quot;,&quot;clipBoardColors&quot;:{&quot;color&quot;:&quot;#fff&quot;,&quot;bg&quot;:&quot;#00000024&quot;}}'><\/div>\r\n\r\n\t\t\n\n\n<h1 class=\"wp-block-heading\">\u5173\u4e8e\u8bed\u97f3\u64ad\u62a5<\/h1>\n\n\n\n<p>Python \u81ea\u5e26\u7684 <code>winsound<\/code> \u6a21\u5757\u53ef\u4ee5\u64ad\u653e\u7b80\u5355\u63d0\u793a\u97f3\uff08\u8702\u9e23\u58f0\uff09\uff1b<br>\u8bed\u97f3\u64ad\u62a5\u7528 Windows \u81ea\u5e26\u7684 <code>SAPI.SpVoice<\/code> \uff08\u901a\u8fc7 <code>comtypes<\/code> \u8c03\u7528\uff09\u6765\u5b9e\u73b0\u6587\u5b57\u8f6c\u8bed\u97f3\u3002<\/p>\n\n\n\n<p>\u5982\u679c\u6ca1\u5b89\u88c5 <code>comtypes<\/code>\uff0c\u5148\u7528\u547d\u4ee4\u5b89\u88c5\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>pip install comtypes<\/code><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"390\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-111.png\" alt=\"\" class=\"wp-image-3253\"\/><\/figure>\n\n\n\n<h1 class=\"wp-block-heading\">\u628apy\u6587\u4ef6\u6253\u5305\u4e3aexe<\/h1>\n\n\n\t\t<div class='wp-block-bch-code-highlight  align' id='bhcCodeHighlight-06980505-d' data-attributes='{&quot;cId&quot;:&quot;06980505-d&quot;,&quot;code&quot;:&quot;pyinstaller --onefile --windowed \\u5173\\u673a\\u548c\\u7761\\u7720.py&quot;,&quot;align&quot;:&quot;&quot;,&quot;language&quot;:&quot;javascript&quot;,&quot;lineNumbers&quot;:true,&quot;theme&quot;:&quot;default&quot;,&quot;codeTypo&quot;:{&quot;desktop&quot;:18,&quot;tablet&quot;:15,&quot;mobile&quot;:14},&quot;clipBoard&quot;:true,&quot;wordWrap&quot;:true,&quot;width&quot;:{&quot;desktop&quot;:&quot;100%&quot;,&quot;tablet&quot;:&quot;100%&quot;,&quot;mobile&quot;:&quot;100%&quot;},&quot;height&quot;:{&quot;desktop&quot;:&quot;0px&quot;,&quot;tablet&quot;:&quot;0px&quot;,&quot;mobile&quot;:&quot;0px&quot;},&quot;padding&quot;:{&quot;top&quot;:&quot;0px&quot;,&quot;right&quot;:&quot;0px&quot;,&quot;bottom&quot;:&quot;0px&quot;,&quot;left&quot;:&quot;0px&quot;},&quot;background&quot;:{&quot;color&quot;:&quot;#d3cfcf42&quot;},&quot;layout&quot;:{&quot;align&quot;:&quot;left&quot;},&quot;border&quot;:{&quot;color&quot;:&quot;#000&quot;,&quot;style&quot;:&quot;solid&quot;,&quot;width&quot;:&quot;0px&quot;},&quot;shadow&quot;:[],&quot;alignment&quot;:&quot;center&quot;,&quot;clipBoardColors&quot;:{&quot;color&quot;:&quot;#fff&quot;,&quot;bg&quot;:&quot;#00000024&quot;}}'><\/div>\r\n\r\n\t\t\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"697\" height=\"265\" src=\"https:\/\/blog.kangyue.pro\/wp-content\/uploads\/2025\/06\/image-114.png\" alt=\"\" class=\"wp-image-3264\"\/><\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows7 2025.7\u7248\u672c 2025.6\u7248 \u63d0\u793a\uff1a\u5305\u542b\u4e2d\u6587\u7684Python\u4ee3\u7801\u8981\u4ee5UTF-8\u7684\u7f16\u7801\u4fdd\u5b58\u3002 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20,91,5,6],"tags":[],"class_list":["post-3251","post","type-post","status-publish","format-standard","hentry","category-windows","category-91","category-5","category-6"],"_links":{"self":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3251"}],"version-history":[{"count":14,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3251\/revisions"}],"predecessor-version":[{"id":3572,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=\/wp\/v2\/posts\/3251\/revisions\/3572"}],"wp:attachment":[{"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3251"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3251"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.kangyue.pro\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}