tkinter写日历(完整代码)

运行环境

1.电脑环境
编译器:PyCharm 2021.2.1
解释器:Anaconda 3.8
2.库
tkinter、datetime、calendar 标准库不需要安装

完整代码

import tkinter
import tkinter.ttk
import calendar
import datetime


class Cal(tkinter.Tk):
    def __init__(self):
        # 重写属性
        super(Cal, self).__init__()
        # 获取当天日期 返回列表 ['年', '月', '日']
        self.today = datetime.date.today().isoformat().split('-')

        # 不允许调整界面大小
        self.resizable(0, 0)
        # 标题
        self.title('日历')
        # 界面大小及出现再屏幕中的位置  以屏幕左上交为原点
        self.geometry('325x190+500+200')

        # 设置样式主题
        self.style = tkinter.ttk.Style()
        self.style.theme_use('xpnative')
        self.main()

    def main(self):
        # 设置变量值
        self.year_v = tkinter.StringVar()
        # 放置年
        self.year_v.set(self.today[0])

        # optionmenu 和 entry 允许修改
        self.year = tkinter.ttk.Combobox(self, textvariable=self.year_v, value=[i for i in range(1949, 2999)], width=5,
                                         justify='center')
        self.year.grid(row=0, column=0, columnspan=2)

        self.month_v = tkinter.StringVar()
        self.month_v.set(self.today[1])

        # 添加月 如01 02 03...
        self.v = []
        for i in range(1, 13):
            if i < 10:
                self.v.append('0' + str(i))
            else:
                self.v.append(str(i))

        self.month = tkinter.ttk.Combobox(self, textvariable=self.month_v, value=self.v, width=3, justify='center')
        self.month.grid(row=0, column=2, columnspan=2)

        self.back = tkinter.Button(self, text='返回今天', width=12, command=self.new_today)
        self.back.grid(row=0, column=4, columnspan=3)

        # 设置星期
        self.date_list = ['一', '二', '三', '四', '五', '六', '日']
        for g in range(7):
            t = tkinter.Label(self, text=self.date_list[g], width=5, fg='#808080')
            t.grid(row=1, column=g)

        # after(time, func)方法 每隔time调用func
        # time 表示以毫秒为单位 func 函数对象
        self.after(500, lambda: self.date(int(self.year.get()), int(self.month.get())))

    # 返回今天日期
    def new_today(self):
        # 清空原有日期
        self.year_v.set('')
        self.month_v.set('')
        # 放置今天日期
        self.year_v.set(self.today[0])
        self.month_v.set(self.today[1])

    # 递归函数 在函数内部调用自身
    def date(self, year, month):
        # [[],[].....] 返回值
        self.all_date = calendar.monthcalendar(year, month)

        # enumerate 以元组的形式返回索引和值
        for i in enumerate(self.all_date):
            # 不能更改元组的值 所以这里用新的变量接收一下
            n = i[0]
            for k in enumerate(i[1]):
                # 0 表示空
                if k[1] == 0:
                    text = tkinter.Label(self, text='', width=5, fg='#808080')
                    text.grid(row=n + 2, column=k[0])
                else:
                    text = tkinter.Label(self, text=k[1], width=5, fg='#808080')
                    text.grid(row=n + 2, column=k[0])

                    # 今天日期才执行
                    if self.year_v.get() == self.today[0] and self.month_v.get() == self.today[1]:
                        if str(k[1]) == self.today[2]:
                            text.config(background='#20b2aa')
        self.after(500, lambda: self.date(int(self.year.get()), int(self.month.get())))


if __name__ == '__main__':
    n = Cal()
    n.mainloop()

结尾

为了学习tkinter模块,所以特意写一个日历小程序l来练练手,程序写得不是很好,我已经尽力了(本人自学),望各位见谅,同时也是希望各位看见的大佬能提出宝贵的意见,一个人的路途,终究是孤独的。最后与诸君共勉!!!

猜你喜欢

转载自blog.csdn.net/qq_65898266/article/details/129086064