在python tkinter中创建事件的日历视图

在python tkinter中创建事件的日历视图,python,tkinter,calendar,Python,Tkinter,Calendar,所以我想做的是制作一个日历框架,就像谷歌日历或其他日历程序的视图一样,我可以选择一天,查看那天我必须做的事情,现在是使用python tkinter的时候了。目前在我的数据库中,我有日期、开始时间和结束时间的事件。请注意,我使用的是python 3。任何人都可以给我一个如何做的线索,甚至发送一个链接到一个网站,它说如何做。但拜托,我不是在找一个日期选择器,只是一个日历,告诉我什么时候该做什么。谢谢大家, 编辑:我在SO上找到: tkinter也有使用日历的小部件 但若您只需要将事件显示为列表,那

所以我想做的是制作一个日历框架,就像谷歌日历或其他日历程序的视图一样,我可以选择一天,查看那天我必须做的事情,现在是使用python tkinter的时候了。目前在我的数据库中,我有日期、开始时间和结束时间的事件。请注意,我使用的是python 3。任何人都可以给我一个如何做的线索,甚至发送一个链接到一个网站,它说如何做。但拜托,我不是在找一个日期选择器,只是一个日历,告诉我什么时候该做什么。谢谢大家,

编辑:我在SO上找到:

tkinter也有使用日历的小部件

但若您只需要将事件显示为列表,那个么您只需要使用带有pack或Listbox的标签/按钮。这可以在任何教程中找到

Python有一个模块,可以生成文本或HTML格式的日历

import calendar

text = calendar.TextCalendar() 

print(text.formatmonth(2017, 12)) 
结果:

   December 2017
Mo Tu We Th Fr Sa Su
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
还是全年

print(text.formatyear(2017))
结果:

                                  2017

      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5             1  2  3  4  5
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       6  7  8  9 10 11 12
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      13 14 15 16 17 18 19
16 17 18 19 20 21 22      20 21 22 23 24 25 26      20 21 22 23 24 25 26
23 24 25 26 27 28 29      27 28                     27 28 29 30 31
30 31

       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2       1  2  3  4  5  6  7                1  2  3  4
 3  4  5  6  7  8  9       8  9 10 11 12 13 14       5  6  7  8  9 10 11
10 11 12 13 14 15 16      15 16 17 18 19 20 21      12 13 14 15 16 17 18
17 18 19 20 21 22 23      22 23 24 25 26 27 28      19 20 21 22 23 24 25
24 25 26 27 28 29 30      29 30 31                  26 27 28 29 30

        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                1  2          1  2  3  4  5  6                   1  2  3
 3  4  5  6  7  8  9       7  8  9 10 11 12 13       4  5  6  7  8  9 10
10 11 12 13 14 15 16      14 15 16 17 18 19 20      11 12 13 14 15 16 17
17 18 19 20 21 22 23      21 22 23 24 25 26 27      18 19 20 21 22 23 24
24 25 26 27 28 29 30      28 29 30 31               25 26 27 28 29 30
31

      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                   1             1  2  3  4  5                   1  2  3
 2  3  4  5  6  7  8       6  7  8  9 10 11 12       4  5  6  7  8  9 10
 9 10 11 12 13 14 15      13 14 15 16 17 18 19      11 12 13 14 15 16 17
16 17 18 19 20 21 22      20 21 22 23 24 25 26      18 19 20 21 22 23 24
23 24 25 26 27 28 29      27 28 29 30               25 26 27 28 29 30 31
30 31
它还可以为所选月份提供datetime对象

print(text.monthdatescalendar(2017, 12))
结果

[[datetime.date(2017, 11, 27), datetime.date(2017, 11, 28), datetime.date(2017, 11, 29), datetime.date(2017, 11, 30), datetime.date(2017, 12, 1), datetime.date(2017, 12, 2), datetime.date(2017, 12, 3)],
 [datetime.date(2017, 12, 4), datetime.date(2017, 12, 5), datetime.date(2017, 12, 6), datetime.date(2017, 12, 7), datetime.date(2017, 12, 8), datetime.date(2017, 12, 9), datetime.date(2017, 12, 10)], 
 [datetime.date(2017, 12, 11), datetime.date(2017, 12, 12), datetime.date(2017, 12, 13), datetime.date(2017, 12, 14), datetime.date(2017, 12, 15), datetime.date(2017, 12, 16), datetime.date(2017, 12, 17)], 
 [datetime.date(2017, 12, 18), datetime.date(2017, 12, 19), datetime.date(2017, 12, 20), datetime.date(2017, 12, 21), datetime.date(2017, 12, 22), datetime.date(2017, 12, 23), datetime.date(2017, 12, 24)], 
 [datetime.date(2017, 12, 25), datetime.date(2017, 12, 26), datetime.date(2017, 12, 27), datetime.date(2017, 12, 28), datetime.date(2017, 12, 29), datetime.date(2017, 12, 30), datetime.date(2017, 12, 31)]]
您可以使用Calendar创建生成tkinter.Frame的类,如下所示:


它仍然需要在日历中显示事件,并为按钮分配功能。每个日期都是tkinter。按钮。

请参阅。学习tkinter,您将知道如何操作,或者学习一些HTML和CSS,并使用Python web框架(如flask或django)或其他许多以web方式构建它。这两条路径上都有完整的书籍,但web中也有文档。tkinter有网格布局,可以与标签或按钮一起使用来创建日历视图。顺便说一句:Python有文本或HTML格式的genearet日历模块,但也可以用于构建其他生成器-导入日历;text=calendar.TextCalendar;printtext.formatmonth2017,12;printtext.formatyear2017
# --- class ---

import calendar
import tkinter

class TkinterCalendar(calendar.Calendar):

    def formatmonth(self, master, year, month):

        dates = self.monthdatescalendar(year, month)

        frame = tkinter.Frame(master)

        self.labels = []

        for r, week in enumerate(dates):
            labels_row = []
            for c, date in enumerate(week):
                label = tkinter.Button(frame, text=date.strftime('%Y\n%m\n%d'))
                label.grid(row=r, column=c)

                if date.month != month:
                    label['bg'] = '#aaa'

                if c == 6:
                    label['fg'] = 'red'

                labels_row.append(label)
            self.labels.append(labels_row)

        return frame


# --- example how to use ---

import tkinter as tk

root = tk.Tk()

tkcalendar = TkinterCalendar()

for year, month in [(2017, 11), (2017, 12), (2018,1)]:
    tk.Label(root, text = '{} / {}'.format(year, month)).pack()

    frame = tkcalendar.formatmonth(root, year, month)
    frame.pack()

root.mainloop()