上一篇
Python Tkinter日历界面制作教程 - 简单步骤指南
- Python
- 2025-08-03
- 2239
Python Tkinter日历界面制作教程
学习使用Tkinter创建功能完整、美观的日历应用程序的简单步骤指南
为什么使用Tkinter创建日历界面?
简单易用
Tkinter是Python的标准GUI库,无需额外安装,语法简洁明了,适合初学者快速上手。
跨平台支持
Tkinter应用程序可在Windows、macOS和Linux系统上运行,无需修改代码。
高度可定制
可以完全控制日历的外观和功能,添加事件提醒、日期选择等个性化功能。
创建日历界面的简单步骤
1 导入必要的库
首先导入Tkinter库以及datetime用于日期处理:
import tkinter as tk from tkinter import ttk import datetime
2 创建主窗口和基本布局
设置主窗口并创建日历所需的控件:
class CalendarApp:
def __init__(self, root):
self.root = root
self.root.title("Tkinter日历")
self.root.geometry("500x450")
self.root.resizable(True, True)
# 创建主框架
main_frame = tk.Frame(root, padx=20, pady=20)
main_frame.pack(fill=tk.BOTH, expand=True)
# 创建顶部控件(月份导航)
control_frame = tk.Frame(main_frame)
control_frame.pack(fill=tk.X, pady=(0, 15))
self.prev_btn = tk.Button(control_frame, text="<", width=3)
self.prev_btn.pack(side=tk.LEFT)
self.month_year = tk.Label(control_frame, text="", font=("Arial", 14, "bold"))
self.month_year.pack(side=tk.LEFT, expand=True)
self.next_btn = tk.Button(control_frame, text=">", width=3)
self.next_btn.pack(side=tk.RIGHT)
# 创建星期标题
weekdays = ["日", "一", "二", "三", "四", "五", "六"]
weekday_frame = tk.Frame(main_frame)
weekday_frame.pack(fill=tk.X)
for day in weekdays:
tk.Label(weekday_frame, text=day, width=5, height=2,
relief="ridge", bg="#f0f0f0").pack(side=tk.LEFT, expand=True)
# 创建日历网格
self.calendar_frame = tk.Frame(main_frame)
self.calendar_frame.pack(fill=tk.BOTH, expand=True)
3 实现日历逻辑
添加生成日历和导航功能的逻辑:
def __init__(self, root):
# ...前面的代码...
# 设置当前日期
self.current_date = datetime.datetime.now()
self.prev_btn.config(command=self.prev_month)
self.next_btn.config(command=self.next_month)
# 生成日历
self.generate_calendar()
def prev_month(self):
"""切换到上个月"""
self.current_date = self.current_date.replace(day=1) - datetime.timedelta(days=1)
self.generate_calendar()
def next_month(self):
"""切换到下个月"""
next_month = self.current_date.replace(day=28) + datetime.timedelta(days=4)
self.current_date = next_month.replace(day=1)
self.generate_calendar()
def generate_calendar(self):
"""生成日历网格"""
# 清除现有日历
for widget in self.calendar_frame.winfo_children():
widget.destroy()
# 更新月份-年份标签
month_name = self.current_date.strftime("%B %Y")
self.month_year.config(text=month_name)
# 获取当月的第一天和天数
first_day = self.current_date.replace(day=1)
days_in_month = (first_day.replace(month=first_day.month % 12 + 1, day=1) -
datetime.timedelta(days=1)).day
# 计算第一天是星期几 (0=周日, 6=周六)
weekday_of_first = first_day.weekday() + 1 # 调整为0=周一, 6=周日
if weekday_of_first == 7:
weekday_of_first = 0
# 生成日期按钮
for i in range(6): # 最多6行
for j in range(7): # 7列
day_number = i * 7 + j - weekday_of_first + 1
if day_number < 1 or day_number > days_in_month:
# 不在当前月份的日期
tk.Label(self.calendar_frame, text="", width=5, height=2).grid(row=i, column=j, padx=2, pady=2)
else:
# 当前日期高亮显示
bg_color = "#e0f0ff" if day_number == datetime.datetime.now().day and \
self.current_date.month == datetime.datetime.now().month and \
self.current_date.year == datetime.datetime.now().year else "white"
day_btn = tk.Button(
self.calendar_frame,
text=str(day_number),
width=5,
height=2,
relief="flat",
bg=bg_color,
command=lambda d=day_number: self.select_date(d)
)
day_btn.grid(row=i, column=j, padx=2, pady=2)
def select_date(self, day):
"""处理日期选择"""
selected_date = self.current_date.replace(day=day)
print(f"选择的日期: {selected_date.strftime('%Y-%m-%d')}")
4 启动应用程序
最后添加启动代码:
if __name__ == "__main__":
root = tk.Tk()
app = CalendarApp(root)
root.mainloop()
完整代码示例
以下是完整的日历应用程序代码:
import tkinter as tk
import datetime
class CalendarApp:
def __init__(self, root):
self.root = root
self.root.title("Tkinter日历")
self.root.geometry("500x450")
self.root.resizable(True, True)
# 创建主框架
main_frame = tk.Frame(root, padx=20, pady=20)
main_frame.pack(fill=tk.BOTH, expand=True)
# 创建顶部控件
control_frame = tk.Frame(main_frame)
control_frame.pack(fill=tk.X, pady=(0, 15))
self.prev_btn = tk.Button(control_frame, text="<", width=3, command=self.prev_month)
self.prev_btn.pack(side=tk.LEFT)
self.month_year = tk.Label(control_frame, text="", font=("Arial", 14, "bold"))
self.month_year.pack(side=tk.LEFT, expand=True)
self.next_btn = tk.Button(control_frame, text=">", width=3, command=self.next_month)
self.next_btn.pack(side=tk.RIGHT)
# 创建星期标题
weekdays = ["日", "一", "二", "三", "四", "五", "六"]
weekday_frame = tk.Frame(main_frame)
weekday_frame.pack(fill=tk.X)
for day in weekdays:
tk.Label(weekday_frame, text=day, width=5, height=2,
relief="ridge", bg="#f0f0f0").pack(side=tk.LEFT, expand=True)
# 创建日历网格
self.calendar_frame = tk.Frame(main_frame)
self.calendar_frame.pack(fill=tk.BOTH, expand=True)
# 设置当前日期
self.current_date = datetime.datetime.now()
self.generate_calendar()
def prev_month(self):
"""切换到上个月"""
self.current_date = self.current_date.replace(day=1) - datetime.timedelta(days=1)
self.generate_calendar()
def next_month(self):
"""切换到下个月"""
next_month = self.current_date.replace(day=28) + datetime.timedelta(days=4)
self.current_date = next_month.replace(day=1)
self.generate_calendar()
def generate_calendar(self):
"""生成日历网格"""
# 清除现有日历
for widget in self.calendar_frame.winfo_children():
widget.destroy()
# 更新月份-年份标签
month_name = self.current_date.strftime("%B %Y")
self.month_year.config(text=month_name)
# 获取当月的第一天和天数
first_day = self.current_date.replace(day=1)
days_in_month = (first_day.replace(month=first_day.month % 12 + 1, day=1) -
datetime.timedelta(days=1)).day
# 计算第一天是星期几 (0=周日, 6=周六)
weekday_of_first = first_day.weekday() + 1 # 调整为0=周一, 6=周日
if weekday_of_first == 7:
weekday_of_first = 0
# 生成日期按钮
for i in range(6): # 最多6行
for j in range(7): # 7列
day_number = i * 7 + j - weekday_of_first + 1
if day_number < 1 or day_number > days_in_month:
# 不在当前月份的日期
tk.Label(self.calendar_frame, text="", width=5, height=2).grid(row=i, column=j, padx=2, pady=2)
else:
# 当前日期高亮显示
bg_color = "#e0f0ff" if day_number == datetime.datetime.now().day and \
self.current_date.month == datetime.datetime.now().month and \
self.current_date.year == datetime.datetime.now().year else "white"
day_btn = tk.Button(
self.calendar_frame,
text=str(day_number),
width=5,
height=2,
relief="flat",
bg=bg_color,
command=lambda d=day_number: self.select_date(d)
)
day_btn.grid(row=i, column=j, padx=2, pady=2)
def select_date(self, day):
"""处理日期选择"""
selected_date = self.current_date.replace(day=day)
print(f"选择的日期: {selected_date.strftime('%Y-%m-%d')}")
if __name__ == "__main__":
root = tk.Tk()
app = CalendarApp(root)
root.mainloop()
进阶功能建议
-
+
添加事件提醒
为特定日期添加事件提醒功能,点击日期时显示该日的事件列表
-
+
美化界面
使用Tkinter的ttk主题或自定义样式创建更现代化的界面
-
+
日期范围选择
扩展功能以支持选择日期范围,适用于预订系统等应用场景
-
+
数据持久化
使用SQLite或JSON文件保存事件数据,实现日历数据的持久化存储
本文由DuLieXian于2025-08-03发表在吾爱品聚,如有疑问,请联系我们。
本文链接:http://521pj.cn/20257213.html
发表评论