📆 导读:厌倦了枯燥的Python学习?今天教你用不到100行代码,打造一款高颜值的桌面日历小工具!无需复杂依赖,适合初学者实战,打开即用还能置顶显示,让你的编程学习立即见成效!
为什么要做这个项目?
作为Python初学者,你是否也遇到过这些问题:
学了一堆语法和概念,却不知道能做什么实际应用
网上的项目要么太简单无聊,要么太复杂难懂
想做出漂亮的GUI应用,却发现各种框架复杂难学
别担心!今天这个桌面日历项目,正是Python新手的完美实战练习:
✅ 代码量少(不到100行)却功能完整 ✅ 界面精美,有成就感 ✅ 只用标准库,无需安装复杂依赖 ✅ 生成的应用实用性强,可以日常使用 ✅ 综合运用Python编程的多种基础知识
下面,我们就一起来实现这个高颜值的桌面日历吧!
最终效果预览
这个日历应用最终的样子是这样的:
主要特点:
实现步骤与代码详解
第一步:导入必要的模块
我们只需要Python内置的几个模块就可以完成全部功能:
import tkinter as tk
from tkinter import ttk
import calendar
import time
from datetime import datetime
这里我们使用了:
第二步:创建应用的主框架
我们先设置主窗口的属性,包括标题、大小和背景颜色:
class CalendarApp:
def __init__(self, root):
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(root, bg="#f5f6f5")
self.main_frame.pack(expand=True, pady=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_frame, bg="#ffffff")
self.cal_frame.pack(pady=20, padx=20, fill="both", expand=True)
# 创建日历显示
self.create_calendar()
第五步:实现日历生成功能
这是最核心的部分,我们需要根据当前的年月,生成正确的日历视图:
def create_calendar(self):
# 获取当前年月
now = datetime.now()
year = now.year
month = now.month
# 创建日历对象
cal = calendar.monthcalendar(year, month)
# 月份标题 - 深灰色
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=0, column=0, columnspan=7, pady=5)
# 星期标题 - 浅蓝色背景
weekdays = ["一", "二", "三", "四", "五", "六", "日"]
for i, day 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=1, column=i, padx=1, pady=1)
# 显示日期
today = now.day
for week_num, week in enumerate(cal):
for day_num, day 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 + 2, column=day_num, padx=1, pady
=1)
🔍 代码解析:
使用calendar.monthcalendar
获取当月的日历数据
用网格布局(grid)排列星期和日期
对当天日期进行特殊处理,使用红色背景和方括号标记
空白日期不显示任何内容
第六步:实现时间更新功能
为了让时间和日期实时更新,我们需要创建一个定时更新的函数:
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(1000, self.update_time)
⏰ 小技巧:root.after
方法是实现定时任务的关键,它会在指定毫秒数后调用函数,通过在函数末尾再次调用itself,我们实现了每秒更新一次的效果。
第七步:运行应用程序
最后,我们需要创建主函数来启动我们的应用:
def main():
root = tk.Tk()
app = CalendarApp(root)
root.mainloop()
if __name__ == "__main__":
main()
进阶优化思路
如果你已经掌握了基础版,还可以尝试这些有趣的扩展:
添加农历显示:结合lunar-python库,为日历添加农历日期
自定义主题:实现暗色/亮色主题切换功能
添加提醒功能:集成简单的待办事项或提醒功能
支持切换月份:添加按钮允许查看上个月/下个月
天气集成:通过API获取当天天气信息并显示
项目完整代码
这里是完整的日历应用代码(不到100行):
import tkinter as tk
from tkinter import ttk
import calendar
import time
from datetime import datetime
class CalendarApp:
def __init__(self, root):
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(root, bg="#f5f6f5")
self.main_frame.pack(expand=True, pady=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_frame, bg="#ffffff")
self.cal_frame.pack(pady=20, padx=20, fill="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(year, month)
# 月份标题 - 深灰色
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=0, column=0, columnspan
=7, pady=5)
# 星期标题 - 浅蓝色背景
weekdays = ["一", "二", "三", "四", "五", "六", "日"]
for i, day 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=1, column=i, padx=1, pady=1)
# 显示日期
today = now.day
for week_num, week in enumerate(cal):
for
day_num, day 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 + 2, column=day_num, padx=1, pady=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(1000, self.update_time)
def main():
root = tk.Tk()
app = CalendarApp(root)
root.mainloop()
if __name__ == "__main__":
main()
运行步骤
将上述代码保存为calendar_app.py
打开命令行,导航到文件所在目录
运行命令:python calendar_app.py
享受你的高颜值日历应用吧!
💻 环境要求:只需要Python 3.x版本,无需安装任何额外库!
学习要点总结
通过这个项目,你实际上已经学习了这些重要的Python编程概念:
✅ GUI编程基础:使用tkinter创建图形界面
✅ 布局管理:使用pack和grid两种布局方式
✅ 事件处理:定时更新时间的机制
✅ 日期和时间处理:使用datetime和time模块
✅ 数据结构:处理日历数据的二维列表
✅ 字典应用:星期映射表的使用
✅ 条件控制:区分当天和普通日期
✅ 面向对象编程:使用类组织代码
这个桌面日历项目证明了一个重要的编程理念:好的项目不一定要复杂。通过100行代码,我们创建了一个既美观又实用的应用程序。
对于Python初学者来说,这个项目是理想的实战练习:你不需要掌握高深的算法或复杂的框架,只需要基础的Python知识,就能做出一个可以实际使用的应用。
如果你想继续深入学习Python,欢迎关注我们的公众号,我们会持续分享类似这样的实用项目和编程技巧!