Python春节倒计时:用代码迎接新年的到来!

news2025/3/13 7:25:17

使用Python实现春节倒计时程序

一、引言

随着科技的不断发展,编程已经渗透到我们生活的方方面面。今天,我们将使用Python编写一个春节倒计时程序,来感受编程与传统文化的巧妙结合。该程序将能够显示距离农历2024年春节(大年初一)00:00:00还有多少时间,并在最后30秒时发送提醒信息。通过这个过程,我们将深入了解Python的datetime模块、邮件发送功能以及前端界面的简单设计。

二、准备工作

在开始编写程序之前,我们需要准备一些必要的工具和库。首先,确保你的计算机上已经安装了Python环境。其次,由于我们要发送邮件提醒,所以需要一个电子邮件账号(如Gmail、QQ邮箱等)以及相关的SMTP服务器信息。最后,为了设计前端界面,我们可以选择使用tkinter库,它是Python的标准GUI库之一。

三、获取农历春节日期

由于春节是按照农历来计算的,而Python的datetime模块默认处理的是公历日期,所以我们需要借助第三方库来获取农历春节的日期。在这里,我们可以使用lunardate库来获取农历信息。首先安装该库:

pip install python-lunardate

然后,我们可以编写一个函数来获取指定年份的农历春节日期:

from lunardate import LunarDate
import datetime

def get_lunar_new_year(year):
    # 农历正月初一对应的公历日期
    for month in range(1, 13):
        for day in range(1, 32):
            try:
                ld = LunarDate.fromSolarDate(year, month, day)
                if ld.month == 1 and ld.day == 1:
                    return datetime.datetime(year, month, day)
            except ValueError:
                pass
    return None

这个函数通过遍历指定年份的所有日期,找到农历正月初一对应的公历日期,并返回该日期。注意,由于农历和公历的转换可能存在误差,所以这个函数只是一个近似解。在实际应用中,我们可以使用更加精确的算法或数据表来获取农历春节的日期。

四、实现倒计时功能

接下来,我们将使用Python的datetime模块来实现倒计时功能。首先,我们需要获取当前时间,并计算与农历春节之间的时间差。然后,我们可以使用一个定时器来不断更新显示的时间差,并在最后30秒时发送提醒信息。

下面是一个简单的实现示例:

import datetime
import time
import smtplib
from email.mime.text import MIMEText
from tkinter import Tk, Label, Button, mainloop

def send_email_reminder(subject, content):
    # 配置SMTP服务器信息(以QQ邮箱为例)
    smtp_server = 'smtp.qq.com'
    smtp_port = 587  # QQ邮箱SMTP服务使用587端口
    smtp_username = 'your_email_address@qq.com'  # 替换为你的QQ邮箱地址
    smtp_password = 'your_email_password'  # 替换为你的QQ邮箱授权码(非登录密码)
    sender = smtp_username
    receiver = smtp_username  # 接收者邮箱地址,可以与发送者相同或不同
    msg = MIMEText(content, 'plain', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = sender
    msg['To'] = receiver
    try:
        smtp = smtplib.SMTP(smtp_server, smtp_port)
        smtp.starttls()  # 加密传输
        smtp.login(smtp_username, smtp_password)
        smtp.sendmail(sender, receiver, msg.as_string())
        smtp.quit()
        print("邮件发送成功!")
    except Exception as e:
        print("邮件发送失败:", e)

def countdown_timer(target_time):
    while True:
        now = datetime.datetime.now()
        delta = target_time - now
        if delta.days < 0 or (delta.days == 0 and delta.seconds <= 30):
            # 最后30秒时发送提醒信息,并退出循环
            subject = "春节倒计时提醒"
            content = "距离春节还有最后30秒,准备迎接新的一年吧!"
            send_email_reminder(subject, content)
            break
        else:
            # 显示剩余时间(天、小时、分钟、秒)
            days = delta.days
            hours = delta.seconds // 3600
            minutes = (delta.seconds % 3600) // 60
            seconds = delta.seconds % 60
            time_str = f"{days}{hours}小时 {minutes}分钟 {seconds}秒"
            print(time_str, end="\r")  # 在同一行更新显示,实现倒计时效果
            time.sleep(1)  # 暂停1秒,等待下一次更新

def main():
    year = 2024  # 指定要倒计时的春节年份
    target_time = get_lunar_new_year(year)  # 获取农历春节日期
    if target_time is None:
        print("无法获取指定年份的农历春节日期!")
        return
    target_time = target_time.replace(hour=0, minute=0, second=0)  # 设置为当天的00:00:00
    print(f"距离{year}年春节还有:")
    countdown_timer(target_time)  # 开始倒计时

# 创建前端界面(可选)
class CountdownGUI:
    def __init__(self, target_time):
        self.root = Tk()
        self.root.title("春节倒计时")
        self.label = Label(self.root, font=("Arial", 24))
        self.label.pack()
        self.update_time(target_time)
        self.root.mainloop()

    def update_time(self, target_time):
        def update():
            now = datetime.datetime.now()
            delta = target_time - now
            if delta.days < 0 or (delta.days == 0 and delta.seconds <= 30):
                # 最后30秒时发送提醒信息,并关闭窗口(可选)
                subject = "春节倒计时提醒"
                content = "距离春节还有最后30秒,准备迎接新的一年吧!"
                send_email_reminder(subject, content)
                self.root.destroy()
                return
            else:
                # 显示剩余时间(天、小时、分钟、秒)
                days = delta.days
                hours = delta.seconds // 3600
                minutes = (delta.seconds % 3600) // 60
                seconds = delta.seconds % 60
                time_str = f"{days}{hours}小时 {minutes}分钟 {seconds}秒"
                self.label.config(text=time_str)
                self.root.after(1000, update)  # 1秒后再次更新显示
        update()  # 首次更新显示

# 使用前端界面运行程序(可选)
if __name__ == "__main__":
    year = 2024  # 指定要倒计时的春节年份
    target_time = get_lunar_new_year(year)  # 获取农历春节日期
    if target_time is None:
        print("无法获取指定年份的农历春节日期!")
    else:
        target_time = target_time.replace(hour=0, minute=0, second=0)  # 设置为当天的00:00:00
        app = CountdownGUI(target_time)  # 创建前端界面实例并运行程序(会阻塞后续代码执行)

注意:以上代码示例中,前端界面部分使用了tkinter库来创建一个简单的窗口来显示倒计时。但是,由于tkinter库在主循环中运行时会阻塞后续代码的执行,所以邮件发送功能无法与前端界面同时运行。为了解决这个问题,我们可以将邮件发送功能移到另一个线程中执行,或者使用其他支持异步操作的GUI库(如PyQt5、Kivy等)。然而,由于篇幅限制和保持示例的简洁性,这里没有展示多线程或异步操作的实现方式。在实际应用中,你可以根据需要选择适合的方法来实现前端界面和邮件发送功能的并发执行。同时,请注意保护好你的邮箱账号和密码,避免泄露给他人或在不安全的环境中使用。

演示效果

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1442192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

运维高级篇-分库分表(拆分策略详解)

分库分表 介绍 问题分析 随着互联网及移动互联网的发展&#xff0c;应用系统的数据量也是成指数式增长&#xff0c;若采用单数据库进行数据存 储&#xff0c;存在以下性能瓶颈&#xff1a; IO瓶颈&#xff1a;热点数据太多&#xff0c;数据库缓存不足&#xff0c;产生大量磁盘…

企业级人脸属性检测解决方案

在当今数字化、智能化的时代背景下&#xff0c;人脸识别技术已经成为众多行业不可或缺的一部分。美摄科技&#xff0c;作为人脸识别技术的领先者&#xff0c;为企业提供了一整套先进且高效的人脸属性检测解决方案。 美摄科技的人脸属性检测解决方案&#xff0c;基于深度学习算…

24 SEMC相关

文章目录 24.1 SEMC 简介24.2 SEMC 框图剖析24.2.1 通讯引脚24.2.1.1 SEMC 的片选信号24.2.1.2 数据选通信号 DQS 24.2.2 存储器控制器24.2.3 IP 命令和 AXI 命令24.2.4 驱动时钟 24.4 SEMC 初始化配置结构体24.4.1 dqsMode24.4.2 cmdTimeoutCycles24.4.3 busTimeoutCycles24.4…

Android开发 button 按钮点击两次 响应onclick方法

问题 Android开发 button 按钮点击两次 响应onclick方法 详细问题 笔者xml代码 <!-- 一个按钮 --> <Button android:id"id/button1" android:layout_width"wrap_conten…

排序算法的时间复杂度存在下界问题

对于几种常用的排序算法&#xff0c;无论是归并排序、快速排序、以及更加常见的冒泡排序等&#xff0c;这些排序算法的时间复杂度都是大于等于O(n*lg(n))的&#xff0c;而这些排序算法存在一个共同的行为&#xff0c;那就是这些算法在对元素进行排序的时候&#xff0c;都会进行…

imazing是啥?imazing有什么用

iMazing 是一款用于管理 iOS 设备的第三方软件。它支持在 Windows 或 Mac 电脑上对连接的 iPhone、iPad 或 iPod 进行数据传输、备份和管理工作。用户可以通过 iMazing 传输和备份包括照片、音乐、铃声、视频、电子书和通讯录等在内的多种信息。iMazing 的功能与苹果官方的 iTu…

C#上位机与三菱PLC的通信03--MC协议之A-1E报文解析

1、MC协议帧 MC协议可以在串口通信&#xff0c;也可以在以太网通信&#xff0c;有A-1E和Qna-3E两种模式&#xff0c;这两种都是三菱PLC通信协议中比较常用的两种&#xff0c;一般我们使用比较多的是以太网通信&#xff0c;对于FX5U系列/Q系列/Qna系列/L系列的PLC&#xff0c;…

求职|基于Springboot的校园求职招聘系统设计与实现(源码+数据库+文档)

校园求职招聘系统目录 目录 基于Springboot的校园求职招聘系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、用户信息管理 2、企业信息管理 3、公告类型管理 4、公告信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选…

大型秒杀中如何减库存?JAVA 架构知识

目前来看&#xff0c;业务系统中最常见的就是预扣库存方案&#xff0c;像你在买机票、买电影票时&#xff0c;下单后一般都有个“有效付款时间”&#xff0c;超过这个时间订单自动释放&#xff0c;这都是典型的预扣库存方案。而具体到秒杀这个场景&#xff0c;应该采用哪种方案…

【MATLAB源码-第138期】基于matlab的D2D蜂窝通信仿真,对比启发式算法,最优化算法和随机算法的性能。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 D2D蜂窝通信介绍 D2D蜂窝通信允许在同一蜂窝网络覆盖区域内的终端设备直接相互通信&#xff0c;而无需数据经过基站或网络核心部分转发。这种通信模式具有几个显著优点&#xff1a;首先&#xff0c;它可以显著降低通信延迟&…

Springboot+vue的社区养老服务平台(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区养老服务平台&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区养老服务平台&#xff0c;采用M&#xff08;model&…

【初中生讲机器学习】6. 分类算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-07 最后编辑时间&#xff1a;2024-02-09 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

c语言实现io多路复用(select),进程,线程并发服务器

io多路复用&#xff08;select&#xff09;代码 #include<myhead.h> #include <sys/select.h> #define PORT 8888 #define IP "192.168.250.100" int main(int argc, char const *argv[]) { //创建套接字int sfd socket(AF_INET, SOCK_STREAM, 0…

华为云账号注销之后账号下的域名丢了怎么办?记录一次域名转移权限的经历

背景 我之前在阿里云上买了个域名&#xff0c;有效期10年的&#xff0c;然后在2023年1月末转移到华为云了&#xff0c;交了一年的域名费用&#xff0c;买了一个一年的华为云服务器 一年之后&#xff0c;华为云的服务器也到期了&#xff0c;我就想着参加新用户计划&#xff0c…

Spring IoC容器详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本概念 Spring IoC容器是Spring框架的核心组件&#xff0c;它实现了控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;的设计原则。IoC是一种编程思…

计算一个时间序列中的元素属于一年中的第几季度

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算一个时间序列中的元素 属于这一年中的第几季度 Series.dt.quarter [太阳]选择题 以下代码的输出结果中正确的是? import pandas as pd ts pd.Series(pd.date_range("2024-02…

MFC实现遍历系统进程

今天我们来枚举系统中的进程和结束系统中进程。 认识几个API 1&#xff09;CreateToolhelp32Snapshot 用于创建系统快照 HANDLE WINAPI CreateToolhelp32Snapshot( __in DWORD dwFlags, //指定快照中包含的系统内容__in DWORD th32P…

springboot项目热部署实现(Spring Boot DevTools方式)

文章目录 Spring Boot DevTools简介Spring Boot DevTools原理spring Boot Devtools优缺点Spring Boot DevTools集成步骤第一步&#xff1a;添加maven依赖第二步&#xff1a;IDEA热部署配置 Spring Boot DevTools简介 Spring Boot DevTools是Spring Boot提供的一个开发工具&…

《动手学深度学习(PyTorch版)》笔记7.7

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过&…

Linux探秘之旅:透彻理解路径、命令与系统概念

目录 如何远程连接 远程登录简明指南 linux区别 1.严格区分大小写 2.linux的命令返回结果判断 3.如何查看网络信息 4.关于后缀名&#xff08;Linux不关心文件后缀&#xff09; 4.1 需要记忆的后缀 5.echo命令 6.linux一切皆文件 6.1比如磁盘的文件 6.2可执行文件 …