Python创建日历实例
程序员文章站
2022-05-25 18:21:44
本文讲述了python创建日历的方法,与以往不同的是,本文实例不使用python提供的calendar实现,相信对大家的python程序设计有一定的借鉴价值。
此程序在w...
本文讲述了python创建日历的方法,与以往不同的是,本文实例不使用python提供的calendar实现,相信对大家的python程序设计有一定的借鉴价值。
此程序在windows下测试通过,由于python字符编码直接输出给操作系统,so win下以gbk ansi为准,linux下大概以utf-8为准(未测试)
#coding=gbk # -*- coding: cp936 -*- # 制作一个日历(只显示阳历日期) '''实现方法:不使用python提供的calendar,根据给出的日期计算: 1.先根据输入年份得到这一年的第一天是星期几((year + (year - 1)/4 - (year - 1)/100 + (year -1)/400)% 7) 2.再依据输入的日期(只需要年月就可以了)得到这个日期得到在当前年份的第几天 3.根据1和2得到当前月份的第一天是星期几。 4.创建日历,其实就是在5x7的表格中预先放置5*7个label,分别表示1-31的情况(应该包含所有的情况)。 5.将1-31从得到的位置开始打印出来,以7为一行。 6.更新日历,当对日历头进行操作(改变日期时)就会更新日历显示的内容。 7.整个组件的布局是7x7的表格方式。第一行显示日历头,包括年月日的显示与选择;第二行为显示的日期,3-7为显示的月份信息。 ''' class calendar: pass appcal = calendar() import time def calcfirstdayofmonth(year,month,day): '''计算某一日的是星期几''' months = (0,31,59,90,120,151,181,212,243,273,304,334) if 0 <= month <= 12: sum = months[month - 1] else: print 'data error' # 对年月做了判断,日只是加了上下限,没有根据月判断输入的是否合法 if year < 0 or month < 0 or month > 11 or day < 0 or day >31: import os os._exit(1) sum += day leap = 0 if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)): leap = 1 if (leap == 1) and (month > 2): sum += 1 # 先计算某年的第一天是星期几 # (year + (year - 1)/4 - (year - 1)/100 + (year -1)/400)% 7 return (sum % 7 - 1 + (year + (year - 1)/4 - (year - 1)/100 + (year -1)/400))% 7 def createmonth(master): '''创建日历''' for i in range(5): for j in range(7): label(master,text = '').grid(row = i + 2,column = j) def updatedate(): ''' 更新日历''' #得到当前选择的日期 year = int(appcal.vyear.get()) month = int(appcal.vmonth.get()) day = int(appcal.vday.get()) months = [31,28,31,30,31,30,31,31,30,31,30,31] # 判断是否瑞年 if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)): months[1] += 1 fd = calcfirstdayofmonth(year,month,1) for i in range(5): for j in range(7): root.grid_slaves(i +2,j)[0]['text'] = '' for i in range(1,months[month - 1] + 1): root.grid_slaves((i + fd - 1)/7 + 2,(i + fd -1)%7)[0]['text'] = str(i) def drawheader(master): '''添加日历头''' # 得到当前的日期,设置为默认值 now = time.localtime(time.time()) col_idx = 0 # 创建年份组件 appcal.vyear = stringvar() appcal.vyear.set(now[0]) label(master,text = 'year').grid(row = 0,column = col_idx);col_idx += 1 omyear = apply(optionmenu,(master,appcal.vyear) + tuple(range(2005,2010))) omyear.grid(row = 0,column = col_idx);col_idx += 1 # 创建月份组件 appcal.vmonth = stringvar() appcal.vmonth.set(now[1]) label(master,text = 'month').grid(row = 0,column = col_idx);col_idx += 1 ommonth = apply(optionmenu,(master,appcal.vmonth) + tuple(range(1,12))) ommonth.grid(row = 0,column = col_idx);col_idx += 1 # 创建年份组件 appcal.vday = stringvar() appcal.vday.set(now[2]) label(master,text = 'day').grid(row = 0,column = col_idx);col_idx += 1 omday = apply(optionmenu,(master,appcal.vday) + tuple(range(1,32))) omday.grid(row = 0,column = col_idx);col_idx += 1 # 创建更新按钮 btupdate = button(master,text = 'update',command = updatedate) btupdate.grid(row = 0,column = col_idx);col_idx += 1 # 打印星期标签 weeks = ['sun.','mon.','tues.','wed.','thurs.','fri.','sat.'] for week in weeks: label(master,text = week).grid(row = 1,column = weeks.index(week)) from tkinter import * root = tk() drawheader(root) createmonth(root) updatedate() root.mainloop()
感兴趣的朋友可以调试运行一下本文实例,并根据自身需求对代码加以改进和完善。