python程序25:寫一個應用實例–萬年歷
今天寫一個python的應用實例,用到了python的三個模塊–tkinter、datetime、calendar,tkinter這個模塊之前的教程介紹過這里就不過多贅述,簡單說一下另外兩個默認模塊。
datetime定義了幾個類來表示日期、時間和時間間隔。其中最重要的類有:
datetime.date:表示日期的類,包括年、月、日。
datetime.time:表示時間的類,包括時、分、秒、毫秒。
datetime.datetime:表示日期和時間的類,包括年、月、日、時、分、秒、毫秒。
datetime.timedelta:表示時間間隔的類,可以用來進行時間的加減運算。
這些類都有各自的構造函數(shù)和屬性,可以根據(jù)需要進行使用。例如,可以使用 datetime.datetime.now() 獲取當前日期和時間,或者使用 datetime.timedelta(days=1) 創(chuàng)建一個代表一天時間間隔的實例。
calendar
?模塊是 Python 中處理日歷的標準庫。它提供了一些函數(shù)和類來處理日歷和日期。其中最常用的函數(shù)有:
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)
:返回在給定年份范圍內(nèi)的閏年數(shù)量。
此外,calendar
?模塊還提供了一些類,如?calendar.TextCalendar
?和?calendar.HTMLCalendar
,可以用于生成文本或 HTML 格式的日歷。這些類可以自定義輸出格式,并支持多種語言。
這里同樣需要先安裝模塊:pip install tkinter
以下為萬年歷代碼:
import tkinter as tk
import datetime
import calendar
class CalendarApp:
? ?def __init__(self):
? ? ? ?# 創(chuàng)建主窗口
? ? ? ?self.root = tk.Tk()
? ? ? ?self.root.title('萬年歷')
? ? ? ?# 創(chuàng)建日期標簽
? ? ? ?self.date_label = tk.Label(self.root, text='', font=('Arial', 20))
? ? ? ?self.date_label.pack(pady=20)
? ? ? ?# 創(chuàng)建日歷表格
? ? ? ?self.table = tk.Frame(self.root)
? ? ? ?self.table.pack(pady=20)
? ? ? ?# 創(chuàng)建日期選擇框
? ? ? ?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):
? ? ? ?# 創(chuàng)建備忘錄窗口
? ? ? ?memo_window = tk.Toplevel(self.root)
? ? ? ?memo_window.title(f'{date}備忘錄')
? ? ? ?# 創(chuàng)建備忘錄文本框
? ? ? ?memo_text = tk.Text(memo_window, font=('Arial', 16))
? ? ? ?memo_text.pack(padx=20, pady=20)
? ? ? ?# 加載備忘錄內(nèi)容
? ? ? ?try:
? ? ? ? ? ?with open(f'{date}.txt', 'r') as f:
? ? ? ? ? ? ? ?memo_text.insert(tk.END, f.read())
? ? ? ?except FileNotFoundError:
? ? ? ? ? ?pass
? ? ? ?# 創(chuàng)建保存按鈕
? ? ? ?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):
? ? ? ?# 保存?zhèn)渫泝?nèi)容
? ? ? ?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運行一下,

在文本框內(nèi)輸入日期和月份后點擊Go即可跳轉到該月份,這里最多能夠從公元元年到9999年任意一個月份,如下圖所示,真正實現(xiàn)了萬年歷。


點擊某一個日期,能夠添加備忘錄。

感興趣的同學在IDE里嘗試一下吧。