社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

A逍遥之路 • 4 周前 • 40 次点击  

📆 导读:厌倦了枯燥的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
 
40 次点击