文章目录
前言
上篇讲到了怎么利用time.sleep()强制等待的方式,实现定时任务。
本篇讲解不中断程序,就可以定时任务。
意义在于不影响正常运行的程序
一、time是什么?
time
模块是 Python 标准库中的一个模块,提供了与时间相关的功能和操作。它允许你获取当前时间、进行时间的格式化和解析、进行时间的延时等操作。
二、使用步骤
1.引入库
由于它是标准库函数,不需要下载直接调用函数。代码如下:
import time
2.获取当前时间字符串形式
接下来我们需要获取当前时间,并且修改为我们想要的格式。
方便之后修改时间。代码如下:
# 获取当前时间字符串
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
3.获取目标时间字符串
根据用户设定的时间,修改之前获取的当前时间作为目标时间
因字符串格式无法直接修改,所以利用重组字符串的方式修改。代码如下:
# 用户设定的时间
target_time = input("请输入时间:")
# 重组时间字符串
part1 = formatted_time[:11]
part2 = formatted_time[11 + len(target_time):]
# 将新字符串插入到指定位置
new_string = part1 + target_time + part2
4.获取目标时间戳
接着将目标时间修改为时间戳格式,方便计算等待时间。代码如下:
# 将时间字符串解析为时间元组
time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
# 将时间元组转换为时间戳
timestamp = time.mktime(time_tuple)
5.定时任务
不断查看当前时间戳,直到当前时间戳大于等于目标时间开始任务。
强调由于时间戳变化不一样,所以时间戳不会相等
while True:
# 当前时间戳
current_time2 = time.time()
if current_time2 >= timestamp:
print("当前任务")
break
三、实践
1.需求
写一个闹钟程序:设置闹钟时间后,时间到触发闹钟提醒弹窗
2.源代码
使用了tkinter框架实现这个功能,代码如下:
import tkinter as tk
from tkinter import messagebox
import time
def set_alarm():
# 获取用户输入的小时和分钟
target_time = entry_time.get()
try:
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
# 重组时间字符串
part1 = formatted_time[:11]
part2 = formatted_time[11 + len(target_time):]
# 将新字符串插入到指定位置
new_string = part1 + target_time + part2
# 将时间字符串解析为时间元组
time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
# 将时间元组转换为时间戳
timestamp = time.mktime(time_tuple)
messagebox.showinfo("闹钟设置", f"闹钟将在 {target_time} 触发。")
while True:
# 当前时间戳
current_time2 = time.time()
if current_time2 >= timestamp:
show_alarm()
break
except ValueError:
messagebox.showerror("错误", "请输入有效的小时和分钟。")
def show_alarm():
messagebox.showinfo("闹钟提醒", "闹钟时间到!")
# 创建主窗口
root = tk.Tk()
root.title("闹钟")
# 标签和输入框用于输入小时和分钟
label_time = tk.Label(root, text="时间:")
label_time.grid(row=0, column=0, padx=5, pady=5, sticky="e")
entry_time = tk.Entry(root)
entry_time.grid(row=0, column=1, padx=5, pady=5)
# 设置按钮用于触发闹钟设置
button_set_alarm = tk.Button(root, text="设置闹钟", command=set_alarm)
button_set_alarm.grid(row=2, column=0, columnspan=2, pady=10)
# 运行主循环
root.mainloop()
3.结果
功能实现步骤:运行后输入时间,再点击设置闹钟的按钮。
下面是运行后的情况:
4.详解
4.1 分析
需求是让我们设计一个闹钟
由于这次我们加了界面,我们可以分为前端和后端开发
下面开始一步步操作:
4.2 用户界面(前端)
简单的pc端界面使用tkinter开发比较方便。
本次使用tkinter开发显示界面
4.2.1 主窗口
我们开始调用python的内置库,并写入主程序。代码和效果如下:
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("闹钟")
# 运行主循环
root.mainloop()
4.2.2 标签和输入框
接下来我们我们添加一个文本标签和输入框。
这里的文本标签展示文本给用户,提示用户这是干什么。(次要)
输入框可以将用户输入的数据存贮起来,方便之后数据处理。(核心)
代码和效果如下:
import tkinter as tk
# 创建主窗口
root = tk.Tk()
root.title("闹钟")
# 标签和输入框用于输入小时和分钟
label_time = tk.Label(root, text="时间:")
label_time.grid(row=0, column=0, padx=5, pady=5, sticky="e")
entry_time = tk.Entry(root)
entry_time.grid(row=0, column=1, padx=5, pady=5)
# 运行主循环
root.mainloop()
4.2.3 设置闹钟按钮
接下来我们添加一个按钮,按钮名称为“设置闹钟”,点击按钮告诉后端现在可以处理数据
现在还需要增加后端数据处理完数据后,前端一个反馈提示,告诉用户现在的情况是什么
这里我写了两个函数set_alarm()和show_alarm()
set_alarm()在用户输入时间后点击按钮提示信息
show_alarm()在闹钟时间到时,文本提示用户,这里你也可以播放MP4文件达到闹钟效果
代码和效果如下:
import tkinter as tk
from tkinter import messagebox
import time
def set_alarm():
# 获取用户输入的小时和分钟
target_time = entry_time.get()
try:
messagebox.showinfo("闹钟设置", f"闹钟将在 {target_time} 触发。")
except ValueError:
messagebox.showerror("错误", "请输入有效的小时和分钟。")
def show_alarm():
messagebox.showinfo("闹钟提醒", "闹钟时间到!")
# 创建主窗口
root = tk.Tk()
root.title("闹钟")
# 标签和输入框用于输入小时和分钟
label_time = tk.Label(root, text="时间:")
label_time.grid(row=0, column=0, padx=5, pady=5, sticky="e")
entry_time = tk.Entry(root)
entry_time.grid(row=0, column=1, padx=5, pady=5)
# 设置按钮用于触发闹钟设置
button_set_alarm = tk.Button(root, text="设置闹钟", command=set_alarm)
button_set_alarm.grid(row=2, column=0, columnspan=2, pady=10)
# 运行主循环
root.mainloop()
4.3 后端(完成)
前端框架已经写完了,接下来就是后端数据处理的代码了,也就是本文主讲解。
如有疑惑请看目录第二点:使用步骤
import tkinter as tk
from tkinter import messagebox
import time
def set_alarm():
# 获取用户输入的小时和分钟
target_time = entry_time.get()
try:
formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
# 重组时间字符串
part1 = formatted_time[:11]
part2 = formatted_time[11 + len(target_time):]
# 将新字符串插入到指定位置
new_string = part1 + target_time + part2
# 将时间字符串解析为时间元组
time_tuple = time.strptime(new_string, "%Y-%m-%d %H:%M:%S")
# 将时间元组转换为时间戳
timestamp = time.mktime(time_tuple)
messagebox.showinfo("闹钟设置", f"闹钟将在 {target_time} 触发。")
while True:
# 当前时间戳
current_time2 = time.time()
if current_time2 >= timestamp:
show_alarm()
break
except ValueError:
messagebox.showerror("错误", "请输入有效的小时和分钟。")
def show_alarm():
messagebox.showinfo("闹钟提醒", "闹钟时间到!")
# 创建主窗口
root = tk.Tk()
root.title("闹钟")
# 标签和输入框用于输入小时和分钟
label_time = tk.Label(root, text="时间:")
label_time.grid(row=0, column=0, padx=5, pady=5, sticky="e")
entry_time = tk.Entry(root)
entry_time.grid(row=0, column=1, padx=5, pady=5)
# 设置按钮用于触发闹钟设置
button_set_alarm = tk.Button(root, text="设置闹钟", command=set_alarm)
button_set_alarm.grid(row=2, column=0, columnspan=2, pady=10)
# 运行主循环
root.mainloop()
总结
本文讲述程序不中断情况下,达到定时任务的效果
当然你也可以使用多线程的方式,实现这种效果
如有不足之处,欢迎大家指导
如果朋友对本文有哪些疑惑,可以在评论区或者私信联系我