文章目录
- 代码
代码
importosimportsysimporttkinterastkfromtkinterimportmessagebox,ttkimportthreadingclassShutdownApp:def__init__(self,root):self.root=root self.root.title("🌙 极简定时关机助手")self.root.geometry("400x350")# 状态变量self.remaining_time=0self.countdown_active=Falseself.timer_after_id=None# --- 界面布局 ---# 1. 标题title_label=tk.Label(root,text="设置关机时间",font=("微软雅黑",16,"bold"))title_label.pack(pady=20)# 2. 输入区域input_frame=tk.Frame(root)input_frame.pack(pady=10)tk.Label(input_frame,text="分钟:",font=("微软雅黑",12)).pack(side=tk.LEFT,padx=5)self.minute_entry=tk.Entry(input_frame,width=10,font=("微软雅黑",12),justify='center')self.minute_entry.insert(0,"30")# 默认30分钟self.minute_entry.pack(side=tk.LEFT,padx=5)# 3. 按钮区域btn_frame=tk.Frame(root)btn_frame.pack(pady=20)self.start_btn=tk.Button(btn_frame,text="开始倒计时",bg="#4CAF50",fg="white",font=("微软雅黑",12),command=self.start_shutdown)self.start_btn.pack(side=tk.LEFT,padx=10)self.cancel_btn=tk.Button(btn_frame,text="取消关机",bg="#f44336",fg="white",font=("微软雅黑",12),command=self.cancel_shutdown)self.cancel_btn.pack(side=tk.LEFT,padx=10)# 4. 状态显示self.status_label=tk.Label(root,text="⏳ 等待设置...",fg="gray",font=("微软雅黑",12))self.status_label.pack(pady=20)# 窗口关闭处理self.root.protocol("WM_DELETE_WINDOW",self.on_close)defstart_shutdown(self):try:minutes=int(self.minute_entry.get())ifminutes<=0:messagebox.showwarning("输入错误","请输入大于 0 的分钟数!")return# 转换为秒self.remaining_time=minutes*60self.countdown_active=True# 更新按钮状态self.start_btn.config(state=tk.DISABLED)self.status_label.config(text=f"⏱ 将在{minutes}分钟后关机",fg="blue")# 调用系统关机命令 (Windows: shutdown -s -t 秒数)# 注意:这里只发送命令,系统会在后台倒计时# 为了安全,建议先测试命令是否有效ifsys.platform.startswith("win"):os.system(f"shutdown -s -t{self.remaining_time}")else:# Linux/Mac 需要 sudo 权限,此处仅为模拟提示print(f"模拟: 将在{minutes}分钟后关机 (实际需执行系统命令)")# 启动界面倒计时更新self.update_ui()exceptValueError:messagebox.showerror("错误","请输入有效的数字!")defupdate_ui(self):ifself.remaining_time>0andself.countdown_active:mins,secs=divmod(self.remaining_time,60)self.status_label.config(text=f"⏱ 剩余时间:{mins}分{secs}秒")self.remaining_time-=1# 每隔1秒调用一次自身,非阻塞self.timer_after_id=self.root.after(1000,self.update_ui)elifself.countdown_active:# 倒计时结束self.status_label.config(text="⚠️ 系统即将关机...",fg="red")self.countdown_active=Falseself.start_btn.config(state=tk.NORMAL)defcancel_shutdown(self):ifnotself.countdown_active:# 即使界面没在动,系统后台可能已经设置了关机,所以都尝试取消pass# 调用系统取消命令 (Windows: shutdown -a)ifsys.platform.startswith("win"):os.system("shutdown -a")# 重置界面状态self.countdown_active=Falseifself.timer_after_id:self.root.after_cancel(self.timer_after_id)self.status_label.config(text="✅ 已取消关机任务",fg="green")self.start_btn.config(state=tk.NORMAL)messagebox.showinfo("成功","定时关机已取消!")defon_close(self):ifself.countdown_active:ifmessagebox.askokcancel("确认退出","当前有进行中的关机任务,确定要退出吗?\n(任务将继续在后台运行)"):self.root.destroy()else:self.root.destroy()if__name__=="__main__":root=tk.Tk()app=ShutdownApp(root)root.mainloop()窗口即使关闭了,这个任务还会有效。
那么如何终止呢?
是这样,上述代码将shutdown指令发给了windows系统,所以要终止,还要从windows命令来入手。
win+r,输入shutdown -a,表示终止关机任务,这样就可以了。