现在工作需要用到定时关机这个功能,就用python写了一个定时关机小工具,可以设置年月日分秒,然后自己可以设置后显示关机倒计时,也可以取消关机。成品软件在文章底部即可下载(温馨提示:把电脑杀毒关闭掉,软件会误报导致无法运行!!!,这个软件并不会真的让系统关机,所以没有调用系统权限,大家有需要可以自己把源码拿去添加即可!)软件演示图如下:
成品代码:
import tkinter as tk from tkinter import ttk, messagebox import datetime import time import os # 初始化窗口 root = tk.Tk() root.title("定时关机程序") root.geometry("600x400") # 创建自适应布局 root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7, 8), weight=1) root.grid_columnconfigure((0, 1, 2), weight=1) # 变量声明 year_var = tk.IntVar(value=datetime.datetime.now().year) month_var = tk.IntVar(value=datetime.datetime.now().month) day_var = tk.IntVar(value=datetime.datetime.now().day) hour_var = tk.IntVar(value=datetime.datetime.now().hour) minute_var = tk.IntVar(value=datetime.datetime.now().minute) second_var = tk.IntVar(value=datetime.datetime.now().second) shutdown_time_text = tk.StringVar(value="请选择关机时间") countdown_text = tk.StringVar(value="") # 初始化关机时间 shutdown_time = None # 定义设置关机时间函数 def set_shutdown_time(): global shutdown_time try: year = year_var.get() month = month_var.get() day = day_var.get() hour = hour_var.get() minute = minute_var.get() second = second_var.get() # 创建datetime对象 shutdown_time = datetime.datetime(year, month, day, hour, minute, second) if shutdown_time < datetime.datetime.now(): raise ValueError("请选择未来的时间") shutdown_time_text.set(f"关机时间: {shutdown_time.strftime('%Y-%m-%d %H:%M:%S')}") messagebox.showinfo("成功", "关机时间已设置") start_countdown() except ValueError as e: messagebox.showerror("错误", str(e)) # 开始倒计时 def start_countdown(): global shutdown_time while shutdown_time > datetime.datetime.now(): remaining_time = shutdown_time - datetime.datetime.now() countdown_text.set(f"倒计时: {remaining_time}") root.update() time.sleep(1) if shutdown_time == datetime.datetime.now(): shutdown_computer() # 关闭计算机 def shutdown_computer(): platform = os.uname().sysname if platform == "Darwin": # MAC平台 os.system("osascript -e 'tell app \"System Events\" to shut down'") messagebox.showinfo("关机", "计算机将在10秒后关闭") elif platform == "Windows": # Windows平台 os.system("shutdown /s /t 10") messagebox.showinfo("关机", "计算机将在10秒后关闭") else: messagebox.showerror("错误", "不支持的平台") # 创建年月日分秒输入框 year_label = ttk.Label(root, text="年", font=("Helvetica", 12)) year_label.grid(row=0, column=0, padx=20, pady=10, sticky="e") year_entry = ttk.Entry(root, textvariable=year_var, width=15) year_entry.grid(row=0, column=1, padx=20, pady=10) month_label = ttk.Label(root, text="月", font=("Helvetica", 12)) month_label.grid(row=1, column=0, padx=20, pady=10, sticky="e") month_entry = ttk.Entry(root, textvariable=month_var, width=15) month_entry.grid(row=1, column=1, padx=20, pady=10) day_label = ttk.Label(root, text="日", font=("Helvetica", 12)) day_label.grid(row=2, column=0, padx=20, pady=10, sticky="e") day_entry = ttk.Entry(root, textvariable=day_var, width=15) day_entry.grid(row=2, column=1, padx=20, pady=10) hour_label = ttk.Label(root, text="时", font=("Helvetica", 12)) hour_label.grid(row=3, column=0, padx=20, pady=10, sticky="e") hour_entry = ttk.Entry(root, textvariable=hour_var, width=15) hour_entry.grid(row=3, column=1, padx=20, pady=10) minute_label = ttk.Label(root, text="分", font=("Helvetica", 12)) minute_label.grid(row=4, column=0, padx=20, pady=10, sticky="e") minute_entry = ttk.Entry(root, textvariable=minute_var, width=15) minute_entry.grid(row=4, column=1, padx=20, pady=10) second_label = ttk.Label(root, text="秒", font=("Helvetica", 12)) second_label.grid(row=5, column=0, padx=20, pady=10, sticky="e") second_entry = ttk.Entry(root, textvariable=second_var, width=15) second_entry.grid(row=5, column=1, padx=20, pady=10) # 显示关机时间标签 shutdown_time_label = ttk.Label(root, textvariable=shutdown_time_text, font=("Helvetica", 16)) shutdown_time_label.grid(row=6, column=0, columnspan=3, padx=20, pady=10) # 显示倒计时标签 countdown_label = ttk.Label(root, textvariable=countdown_text, font=("Helvetica", 16)) countdown_label.grid(row=7, column=0, columnspan=3, padx=20, pady=10) # 创建设置关机时间按钮 set_button = ttk.Button(root, text="设置关机时间", command=set_shutdown_time, width=30) set_button.grid(row=8, column=0, columnspan=3, padx=20, pady=10) # 运行主循环 root.mainloop()
注释程序:
import tkinter as tk # 导入tkinter模块,用于创建图形用户界面 from tkinter import ttk, messagebox # 从tkinter中导入ttk和messagebox模块 import random # 导入随机模块,用于生成随机数 # 初始化窗口 root = tk.Tk() # 创建主窗口对象 root.title("猜数字游戏") # 设置窗口标题 root.geometry("600x400") # 设置窗口尺寸为宽600px,高400px # 创建自适应布局 # 配置,以便在窗口大小改变时,行和列能够自适应 root.grid_rowconfigure((0, 1, 2, 3, 4, 5, 6, 7), weight=1) root.grid_columnconfigure((0, 1, 2), weight=1) # 变量声明 min_var = tk.IntVar(value=1) # 最小值,默认为1 max_var = tk.IntVar(value=100) # 最大值,默认为100 guess_var = tk.IntVar() # 用户猜测的数字 # 生成目标数字,在最小值和最大值之间 target_number = random.randint(min_var.get(), max_var.get()) result_label_text = tk.StringVar(value="请输入你的猜测") # 结果标签的文本 last_guess_text = tk.StringVar(value="上一次猜测: 无") # 上一次猜测的数字 # 定义猜数字函数 def check_guess(): global target_number # 声明使用全局变量target_number guess = guess_var.get() # 获取用户输入的猜测数字 # 检查猜测数字是否在设定范围内 if guess < min_var.get() or guess > max_var.get(): # 如果猜测数字小于最小值或大于最大值,弹出警告 messagebox.showwarning("警告", f"请输入一个在{min_var.get()}到{max_var.get()}之间的数字") return # 结束函数 last_guess_text.set(f"上一次猜测: {guess}") # 更新上一次猜测的数字显示 # 判断猜测结果 if guess < target_number: # 猜测小于目标数字 result_label_text.set("数字小了哟") # 更新结果标签 elif guess > target_number: # 猜测大于目标数字 result_label_text.set("数字大了哟") # 更新结果标签 else: # 猜测等于目标数字 result_label_text.set("恭喜你,猜中了") # 更新结果标签 show_result_dialog() # 展示结果对话框 # 展示结果对话框 def show_result_dialog(): result = messagebox.askquestion("恭喜", "你猜对了数字!\n你想继续游戏吗?") # 弹出对话框询问 if result == 'yes': # 如果用户选择“是” reset_game() # 重新开始游戏 else: # 如果用户选择“没有” root.quit() # 退出游戏 # 重新开始游戏 def reset_game(): global target_number # 声明使用全局变量target_number # 生成新的目标数字 target_number = random.randint(min_var.get(), max_var.get()) result_label_text.set("请输入你的猜测") # 清除结果信息 last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 # 设置最小值的输入框 min_label = ttk.Label(root, text="最小值", font=("Helvetica", 12)) # 创建标签 min_label.grid(row=0, column=0, padx=20, pady=10, sticky="e") # 将标签放置在网格中 min_entry = ttk.Entry(root, textvariable=min_var, width=15) # 创建输入框,绑定最小值变量 min_entry.grid(row=0, column=1, padx=20, pady=10) # 设置最大值的输入框 max_label = ttk.Label(root, text="最大值", font=("Helvetica", 12)) # 创建标签 max_label.grid(row=1, column=0, padx=20, pady=10, sticky="e") # 将标签放置在网格中 max_entry = ttk.Entry(root, textvariable=max_var, width=15) # 创建输入框,绑定最大值变量 max_entry.grid(row=1, column=1, padx=20, pady=10) # 设置用户输入猜测的框架 guess_frame = ttk.Frame(root) # 创建框架 guess_frame.grid(row=2, column=0, columnspan=3, padx=20, pady=10) # 将框架放置在网格中 guess_label = ttk.Label(guess_frame, text="猜一个数字", font=("Helvetica", 12)) # 创建标签 guess_label.pack(side=tk.LEFT, padx=5, pady=5) # 将标签添加到框架中并设置排列 guess_entry = ttk.Entry(guess_frame, textvariable=guess_var, width=15) # 创建输入框,绑定猜测变量 guess_entry.pack(side=tk.LEFT, padx=5, pady=5) # 将输入框添加到框架中并设置排列 # 创建猜数字按钮 guess_button = ttk.Button(root, text="猜数字", command=check_guess, width=30) # 创建按钮,设置点击事件为check_guess guess_button.grid(row=3, column=0, columnspan=3, padx=20, pady=10) # 将按钮放置在网格中 # 结果显示标签 result_label = ttk.Label(root, textvariable=result_label_text, font=("Helvetica", 16)) # 创建用来显示结果的标签 result_label.grid(row=4, column=0, columnspan=3, padx=20, pady=10) # 将标签放置在网格中 # 上一次猜测显示标签 last_guess_label = ttk.Label(root, textvariable=last_guess_text, font=("Helvetica", 14), borderwidth=2, relief="ridge") # 创建显示上一次猜测的标签 last_guess_label.grid(row=5, column=0, columnspan=3, padx=20, pady=10) # 将标签放置在网格中 # 设置重置范围的函数 def reset_range(): global target_number # 声明使用全局变量target_number try: min_value = min_var.get() # 获取最小值 max_value = max_var.get() # 获取最大值 # 检查最小值是否小于最大值 if min_value >= max_value: raise ValueError("最小值必须小于最大值") # 如果不符合,抛出异常 # 生成新的目标数字 target_number = random.randint(min_value, max_value) result_label_text.set("请输入你的猜测") # 清除结果信息 last_guess_text.set(f"上一次猜测: 无") # 清除上一次猜测的数字显示 messagebox.showinfo("成功", "范围已重置") # 显示成功信息 except ValueError as e: messagebox.showerror("错误", str(e)) # 显示错误信息 # 创建重置范围按钮 reset_button = ttk.Button(root, text="重置范围", command=reset_range, width=30) # 创建按钮,设置点击事件为reset_range reset_button.grid(row=6, column=0, columnspan=3, padx=20, pady=10) # 将按钮放置在网格中 # 运行主循环 root.mainloop() # 启动应用程序主循环
转载请注明:宗宗酱-(电击小子)++>用Python加ai写了一个定时关机小工具