上一篇
Python Tkinter日历界面制作教程 - 简单步骤指南
- Python
- 2025-08-03
- 2012
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发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20257213.html
发表评论