欢迎访问宙启技术站
智能推送

如何用python编写一个简单的日历应用程序

发布时间:2023-12-12 17:31:44

编写一个简单的日历应用程序,我们可以使用tkinter库来创建一个基本的图形用户界面(GUI),以及datetime库来处理日期和时间。下面是一个例子,该程序可以显示当前月份的日历,并且可以根据用户的输入切换到其他月份。

import tkinter as tk
from datetime import datetime, timedelta


def create_calendar(year, month):
    # 获取指定月份的日历数据
    cal_data = []
    cal_data.append(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'])

    # 计算当月第一天的日期和该月的总天数
    first_day = datetime(year, month, 1)
    num_days = (datetime(year, month + 1, 1) - timedelta(days=1)).day

    # 计算当月第一天是周几,并填充空白
    blanks = first_day.weekday()
    cal_data.append([' ']*blanks)

    # 添加日期到日历数据
    day_counter = 1
    while day_counter <= num_days:
        week = []
        for _ in range(7):
            if day_counter <= num_days:
                week.append(day_counter)
            else:
                week.append(' ')
            day_counter += 1
        cal_data.append(week)

    return cal_data


def display_calendar(year, month):
    # 创建日历窗口
    window = tk.Tk()
    window.title('Calendar')

    # 创建月份标签
    month_label = tk.Label(window, text=datetime(year, month, 1).strftime('%B %Y'))
    month_label.pack()

    # 创建日历表格
    cal_data = create_calendar(year, month)
    for week in cal_data:
        for day in week:
            label = tk.Label(window, text=str(day))
            label.pack(side=tk.LEFT)
        tk.Label(window, text='').pack()

    # 创建切换月份的按钮
    prev_button = tk.Button(window, text='<< Prev', command=lambda: change_month(-1))
    prev_button.pack(side=tk.LEFT)

    today_button = tk.Button(window, text='Today', command=lambda: change_month(0))
    today_button.pack(side=tk.LEFT)

    next_button = tk.Button(window, text='Next >>', command=lambda: change_month(1))
    next_button.pack(side=tk.LEFT)

    def change_month(step):
        nonlocal year, month
        if step == -1:
            month -= 1
            if month == 0:
                month = 12
                year -= 1
        elif step == 1:
            month += 1
            if month == 13:
                month = 1
                year += 1
        else:
            year = datetime.now().year
            month = datetime.now().month

        month_label.config(text=datetime(year, month, 1).strftime('%B %Y'))

        # 删除原来的日历表格
        for widget in window.winfo_children():
            widget.destroy()

        # 创建新的日历表格
        cal_data = create_calendar(year, month)
        for week in cal_data:
            for day in week:
                label = tk.Label(window, text=str(day))
                label.pack(side=tk.LEFT)
            tk.Label(window, text='').pack()

        # 重新创建切换按钮
        prev_button = tk.Button(window, text='<< Prev', command=lambda: change_month(-1))
        prev_button.pack(side=tk.LEFT)

        today_button = tk.Button(window, text='Today', command=lambda: change_month(0))
        today_button.pack(side=tk.LEFT)

        next_button = tk.Button(window, text='Next >>', command=lambda: change_month(1))
        next_button.pack(side=tk.LEFT)

    window.mainloop()


if __name__ == '__main__':
    today = datetime.now()
    display_calendar(today.year, today.month)

运行以上代码,会弹出一个日历应用程序的窗口,显示当前月份的日历,并且可以通过切换按钮来切换到其他月份。