Py学习  »  Python

10分钟搞定高颜值桌面日历!Python小白也能轻松上手的实战项目

A逍遥之路 • 3 月前 • 130 次点击  

📆 导读:厌倦了枯燥的Python学习?今天教你用不到100行代码,打造一款高颜值的桌面日历小工具!无需复杂依赖,适合初学者实战,打开即用还能置顶显示,让你的编程学习立即见成效!

为什么要做这个项目?

作为Python初学者,你是否也遇到过这些问题:

  • 学了一堆语法和概念,却不知道能做什么实际应用

  • 网上的项目要么太简单无聊,要么太复杂难懂

  • 想做出漂亮的GUI应用,却发现各种框架复杂难学

别担心!今天这个桌面日历项目,正是Python新手的完美实战练习

✅ 代码量少(不到100行)却功能完整  ✅ 界面精美,有成就感  ✅ 只用标准库,无需安装复杂依赖  ✅ 生成的应用实用性强,可以日常使用  ✅ 综合运用Python编程的多种基础知识  

下面,我们就一起来实现这个高颜值的桌面日历吧!

最终效果预览

这个日历应用最终的样子是这样的:

主要特点:

  • 🕒 实时更新的时间显示,精确到秒

  • 📅 完整的月历视图,突出显示当天日期

  • 🎨  Material Design风格配色,界面清爽美观

  • 📌 窗口置顶功能,便于日常查看

  • 💻 轻量级应用,占用资源少

实现步骤与代码详解

第一步:导入必要的模块

我们只需要Python内置的几个模块就可以完成全部功能:

import tkinter as tk
from tkinter import ttk
import calendar
import time
from datetime import datetime

这里我们使用了:

  • tkinter:Python标准的GUI库,用于创建图形界面

  • calendar:处理日历相关功能

  • time & datetime:处理时间和日期

第二步:创建应用的主框架

我们先设置主窗口的属性,包括标题、大小和背景颜色:

class CalendarApp:
    def __init__(selfroot):
        self.root = root
        self.root.title("日历")
        self.root.geometry("400x540")
        self.root.configure(bg="#f5f6f5")  # 柔和的灰白色背景
        self.root.attributes('-topmost'True)  # 窗口置顶显示
        
        # 设置样式
        self.style = ttk.Style()
        self.style.configure("TLabel"background="#f5f6f5")

        # 创建主框架
        self.main_frame = tk.Frame(rootbg="#f5f6f5")
        self.main_frame.pack(expand=Truepady=20)

💡 小技巧attributes('-topmost', True)这一行代码让我们的日历窗口始终显示在其他窗口的前面,非常适合需要频繁查看时间日期的场景。

第三步:添加时间、日期和星期显示

下面我们添加三个标签,分别显示时间、日期和星期几:

# 时间显示 - 蓝色
self.time_label = tk.Label(
    self.main_frame,
    font=("Helvetica"42"bold"),
    bg="#f5f6f5",
    fg="#2196F3"  # Material Design蓝色
)
self.time_label.pack(pady=10)

# 日期显示 - 绿色
self.date_label = tk.Label(
    self.main_frame,
    font=("Helvetica"18),
    bg="#f5f6f5",
    fg="#4CAF50"  # Material Design绿色
)
self.date_label.pack(pady=5)

# 星期显示 - 紫色
self.weekday_label = tk.Label(
    self.main_frame,
    font=("Helvetica"16),
    bg="#f5f6f5",
    fg="#9C27B0"  # Material Design紫色
)
self.weekday_label.pack(pady=5)

🎨 设计说明:我们使用了Material Design的配色方案,为不同的信息选择了不同的颜色,让界面既美观又清晰。时间使用最大字号和蓝色,作为最醒目的信息。

第四步:创建日历显示区域

接下来创建一个显示整月日历的区域:

# 日历框架
self.cal_frame = tk.Frame(self.main_framebg="#ffffff")
self.cal_frame.pack(pady=20padx=20fill="both"expand=True)

# 创建日历显示
self.create_calendar()

第五步:实现日历生成功能

这是最核心的部分,我们需要根据当前的年月,生成正确的日历视图:

def create_calendar(self):
    # 获取当前年月
    now = datetime.now()
    year = now.year
    month = now.month

    # 创建日历对象
    cal = calendar.monthcalendar(yearmonth)
    
    # 月份标题 - 深灰色
    month_name = calendar.month_name[month]
    month_label = tk.Label(
        self.cal_frame,
        text=f"{year}年 {month_name}",
        font=("Helvetica"14"bold"),
        bg="#ffffff",
        fg="#424242"
    )
    month_label.grid(row=0column=0columnspan=7pady=5)

    # 星期标题 - 浅蓝色背景
     weekdays = ["一""二""三""四""五""六""日"]
    for iday in enumerate(weekdays):
        label = tk.Label(
            self.cal_frame,
            text=day,
            font=("Helvetica"12),
            bg="#BBDEFB",  # 浅蓝色
            fg="#1976D2",  # 深蓝色
            width=5,
            height=2
        )
        label.grid(row=1column=ipadx=1pady=1)

    # 显示日期
    today = now.day
    for week_numweek in enumerate(cal):
        for day_numday in enumerate(week):
            if day !=  0:
                # 当前日期使用特殊标记
                if day == today:
                    bg_color = "#FFCDD2"  # 浅红色背景
                    fg_color = "#D32F2F"  # 深红色文字
                    text = f"[{day}]"  # 用方括号标记当前日期
                else:
                    bg_color = "#ffffff"
                    fg_color = "#757575"
                    text = str(day)

                label = tk.Label(
                    self.cal_frame,
                    text=text,
                    font=("Helvetica"12),
                    bg=bg_color,
                    fg=fg_color,
                    width=5,
                    height=2
                )
                label.grid(row=week_num + 2column=day_numpadx=1pady =1)

🔍 代码解析

  1. 使用calendar.monthcalendar获取当月的日历数据

  2. 用网格布局(grid)排列星期和日期

  3. 对当天日期进行特殊处理,使用红色背景和方括号标记

  4. 空白日期不显示任何内容

第六步:实现时间更新功能

为了让时间和日期实时更新,我们需要创建一个定时更新的函数:

def update_time(self):
    # 更新时间
    current_time = time.strftime("%H:%M:%S")
    self.time_label.config(text=current_time)

    # 更新日期
    current_date = datetime.now().strftime("%Y年%m月%d日")
    self.date_label.config(text=current_date)

    # 更新星期
    weekday = datetime.now().strftime("%A")
    weekday_cn = {
        "Monday" "星期一",
        "Tuesday""星期二",
        "Wednesday""星期三",
        "Thursday""星期四",
        "Friday""星期五",
        "Saturday""星期六",
        "Sunday""星期日"
    }
    self.weekday_label.config(text=weekday_cn[weekday])

    # 每秒更新一次
    self.root.after(1000self.update_time)

⏰ 小技巧root.after方法是实现定时任务的关键,它会在指定毫秒数后调用函数,通过在函数末尾再次调用itself,我们实现了每秒更新一次的效果。

第七步:运行应用程序

最后,我们需要创建主函数来启动我们的应用:

def main():
    root = tk.Tk()
    app = CalendarApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

进阶优化思路

如果你已经掌握了基础版,还可以尝试这些有趣的扩展:

  1. 添加农历显示:结合lunar-python库,为日历添加农历日期

  2. 自定义主题:实现暗色/亮色主题切换功能

  3. 添加提醒功能:集成简单的待办事项或提醒功能

  4. 支持切换月份:添加按钮允许查看上个月/下个月

  5. 天气集成:通过API获取当天天气信息并显示

项目完整代码

这里是完整的日历应用代码(不到100行):

import tkinter as tk
from tkinter import ttk
import calendar
import time
from datetime import datetime


class CalendarApp:
    def __init__(selfroot):
        self.root = root
        self.root.title("日历")
        self.root.geometry ("400x540")
        self.root.configure(bg="#f5f6f5")  # 柔和的灰白色背景
        self.root.attributes('-topmost'True)
        # 设置样式
        self.style = ttk.Style()
        self.style.configure("TLabel"background="#f5f6f5")

        # 创建主框架
        self.main_frame = tk.Frame(rootbg="#f5f6f5")
        self.main_frame.pack(expand=Truepady=20)

        # 时间显示 - 蓝色
        self.time_label = tk.Label(
            self.main_frame,
            font=("Helvetica"42"bold"),
            bg="#f5f6f5",
            fg="#2196F3"  # Material Design蓝色
        )
        self.time_label.pack(pady=10)

        # 日期显示 - 绿色
         self.date_label = tk.Label(
            self.main_frame,
            font=("Helvetica"18),
            bg="#f5f6f5",
            fg="#4CAF50"  # Material Design绿色
        )
        self.date_label.pack(pady=5)

        # 星期显示 - 紫色
        self.weekday_label = tk.Label(
            self.main_frame,
            font=("Helvetica"16),
            bg="#f5f6f5",
            fg="#9C27B0"  # Material Design紫色
        )
        self.weekday_label.pack(pady=5)

        # 日历框架
        self.cal_frame = tk.Frame(self.main_framebg="#ffffff")
        self.cal_frame.pack(pady=20padx=20fill="both"expand= True)

        # 创建日历显示
        self.create_calendar()

        # 启动时间更新
        self.update_time()

    def create_calendar(self):
        # 获取当前年月
        now = datetime.now()
        year = now.year
        month = now.month

        # 创建日历对象
        cal = calendar.monthcalendar(yearmonth)
        # 月份标题 - 深灰色
        month_name = calendar.month_name[month]
        month_label = tk.Label(
            self.cal_frame,
            text=f"{year}年 {month_name}",
            font=("Helvetica"14"bold"),
            bg="#ffffff",
            fg="#424242"
        )
        month_label.grid(row=0column=0columnspan =7pady=5)

        # 星期标题 - 浅蓝色背景
        weekdays = ["一""二""三""四""五""六""日"]
        for iday in enumerate(weekdays):
            label = tk.Label(
                self.cal_frame,
                text=day,
                font=("Helvetica"12),
                bg="#BBDEFB",  # 浅蓝色
                fg="#1976D2",  # 深蓝色
                width=5,
                height=2
            )
            label.grid(row=1column=ipadx=1pady=1)

        # 显示日期
        today = now.day
        for week_numweek in enumerate(cal):
            for  day_numday in enumerate(week):
                if day != 0:
                    # 当前日期使用特殊标记
                    if day == today:
                        bg_color = "#FFCDD2"  # 浅红色背景
                        fg_color = "#D32F2F"  # 深红色文字
                        text = f"[{day}]"  # 用方括号标记当前日期
                    else:
                        bg_color = "#ffffff"
                        fg_color = "#757575"
                        text = str(day)

                    label = tk.Label(
                        self.cal_frame,
                        text=text,
                        font=("Helvetica"12),
                        bg=bg_color,
                        fg=fg_color,
                        width=5,
                        height=2
                    )
                    label.grid(row= week_num + 2column=day_numpadx=1pady=1)

    def update_time(self):
        # 更新时间
        current_time = time.strftime("%H:%M:%S")
        self.time_label.config(text=current_time)

        # 更新日期
        current_date = datetime.now().strftime("%Y年%m月%d日")
        self.date_label.config(text=current_date)

        # 更新星期
        weekday = datetime.now().strftime("%A")
        weekday_cn = {
            "Monday""星期一",
            "Tuesday""星期二",
            "Wednesday""星期三",
            "Thursday""星期四",
            "Friday""星期五",
            "Saturday""星期六",
            "Sunday""星期日"
        }
        self.weekday_label.config(text=weekday_cn[ weekday])

        # 每秒更新一次
        self.root.after(1000self.update_time)


def main():
    root = tk.Tk()
    app = CalendarApp(root)
    root.mainloop()


if __name__ == "__main__":
    main()

运行步骤

  1. 将上述代码保存为calendar_app.py

  2. 打开命令行,导航到文件所在目录

  3. 运行命令:python calendar_app.py

  4. 享受你的高颜值日历应用吧!

💻 环境要求:只需要Python 3.x版本,无需安装任何额外库!

学习要点总结

通过这个项目,你实际上已经学习了这些重要的Python编程概念:

✅ GUI编程基础:使用tkinter创建图形界面  

✅ 布局管理:使用pack和grid两种布局方式  

✅ 事件处理:定时更新时间的机制  

✅ 日期和时间处理:使用datetime和time模块  

✅ 数据结构:处理日历数据的二维列表  

✅ 字典应用:星期映射表的使用  

✅ 条件控制:区分当天和普通日期 

✅ 面向对象编程:使用类组织代码  

这个桌面日历项目证明了一个重要的编程理念:好的项目不一定要复杂。通过100行代码,我们创建了一个既美观又实用的应用程序。

对于Python初学者来说,这个项目是理想的实战练习:你不需要掌握高深的算法或复杂的框架,只需要基础的Python知识,就能做出一个可以实际使用的应用。

如果你想继续深入学习Python,欢迎关注我们的公众号,我们会持续分享类似这样的实用项目和编程技巧!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180502
 
130 次点击