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.TextCalendarcalendar.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里尝试一下吧。

发表回复