现在工作需要用到定时关机这个功能,就用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() # 启动应用程序主循环
本站https://ygz.ink文章https://ygz.ink/archives/1472.html中提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。本站部分信息来自博主网络收集整理,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。如果您喜欢该程序和内容,请支持正版,购买注册,得到更好的正版服务。我们非常重视版权问题,如有侵权请邮件与我们联系处理。敬请谅解!
邮箱:gouweicaosheji@163.com
宗宗酱
