python程序25:写一个应用实例–万年历
今天写一个python的应用实例,用到了python的三个模块–tkinter、datetime、calendar,tkinter这个模块之前的教程介绍过这里就不过多赘述,简单说一下另外两个默认模块。
datetime定义了几个类来表示日期、时间和时间间隔。其中最重要的类有:
datetime.date:表示日期的类,包括年、月、日。
datetime.time:表示时间的类,包括时、分、秒、毫秒。
datetime.datetime:表示日期和时间的类,包括年、月、日、时、分、秒、毫秒。
datetime.timedelta:表示时间间隔的类,可以用来进行时间的加减运算。
这些类都有各自的构造函数和属性,可以根据需要进行使用。例如,可以使用 datetime.datetime.now() 获取当前日期和时间,或者使用 datetime.timedelta(days=1) 创建一个代表一天时间间隔的实例。
calendar
模块是 Python 中处理日历的标准库。它提供了一些函数和类来处理日历和日期。其中最常用的函数有:
calendar.month(year, month, w=0, l=0)
:返回一个字符串,表示给定年份和月份的日历。calendar.calendar(year, w=2, l=1, c=6)
:返回一个字符串,表示给定年份的日历。calendar.weekday(year, month, day)
:返回给定日期是星期几(0 表示星期一,6 表示星期日)。calendar.isleap(year)
:返回给定年份是否为闰年。calendar.leapdays(y1, y2)
:返回在给定年份范围内的闰年数量。
此外,calendar
模块还提供了一些类,如 calendar.TextCalendar
和 calendar.HTMLCalendar
,可以用于生成文本或 HTML 格式的日历。这些类可以自定义输出格式,并支持多种语言。
这里同样需要先安装模块:pip install tkinter
以下为万年历代码:
import tkinter as tk
import datetime
import calendar
class CalendarApp:
def __init__(self):
# 创建主窗口
self.root = tk.Tk()
self.root.title('万年历')
# 创建日期标签
self.date_label = tk.Label(self.root, text='', font=('Arial', 20))
self.date_label.pack(pady=20)
# 创建日历表格
self.table = tk.Frame(self.root)
self.table.pack(pady=20)
# 创建日期选择框
self.year_var = tk.StringVar()
self.year_var.set(str(datetime.datetime.now().year))
self.month_var = tk.StringVar()
self.month_var.set(str(datetime.datetime.now().month))
self.year_entry = tk.Entry(self.root, textvariable=self.year_var, font=('Arial', 16), width=6)
self.year_entry.pack(side=tk.LEFT, padx=10)
self.month_entry = tk.Entry(self.root, textvariable=self.month_var, font=('Arial', 16), width=4)
self.month_entry.pack(side=tk.LEFT)
self.go_button = tk.Button(self.root, text='Go', font=('Arial', 16), command=self.go)
self.go_button.pack(side=tk.LEFT, padx=10)
# 显示日历
self.show_calendar()
def show_calendar(self):
# 清空日历表格
for widget in self.table.winfo_children():
widget.destroy()
# 获取当前月份的日历
cal = calendar.monthcalendar(int(self.year_var.get()), int(self.month_var.get()))
# 添加表头
headers = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su']
for i in range(7):
label = tk.Label(self.table, text=headers[i], font=('Arial', 12))
label.grid(row=0, column=i, padx=5, pady=5)
# 添加日期
for i in range(len(cal)):
for j in range(7):
day = cal[i][j]
if day != 0:
button = tk.Button(self.table, text=str(day), font=('Arial', 12), width=3, height=2)
button.grid(row=i+1, column=j, padx=5, pady=5)
button.bind('<Button-1>', lambda event, date=datetime.date(int(self.year_var.get()), int(self.month_var.get()), day): self.show_memo(event, date))
# 更新日期标签
self.date_label.config(text=f'{self.year_var.get()}年{self.month_var.get()}月')
def show_memo(self, event, date):
# 创建备忘录窗口
memo_window = tk.Toplevel(self.root)
memo_window.title(f'{date}备忘录')
# 创建备忘录文本框
memo_text = tk.Text(memo_window, font=('Arial', 16))
memo_text.pack(padx=20, pady=20)
# 加载备忘录内容
try:
with open(f'{date}.txt', 'r') as f:
memo_text.insert(tk.END, f.read())
except FileNotFoundError:
pass
# 创建保存按钮
save_button = tk.Button(memo_window, text='保存', font=('Arial', 16), command=lambda: self.save_memo(date, memo_text.get('1.0', tk.END)))
save_button.pack(pady=20)
def save_memo(self, date, content):
# 保存备忘录内容
with open(f'{date}.txt', 'w') as f:
f.write(content)
def go(self):
# 显示指定月份的日历
self.show_calendar()
def run(self):
# 运行程序
self.root.mainloop()
if __name__ == '__main__':
app = CalendarApp()
app.run()
按Ctrl+Shift+F10运行一下,

在文本框内输入日期和月份后点击Go即可跳转到该月份,这里最多能够从公元元年到9999年任意一个月份,如下图所示,真正实现了万年历。


点击某一个日期,能够添加备忘录。

感兴趣的同学在IDE里尝试一下吧。