Python创建日历实例
本文讲述了Python创建日历的方法,与以往不同的是,本文实例不使用Python提供的calendar实现,相信对大家的Python程序设计有一定的借鉴价值。
此程序在windows下测试通过,由于python字符编码直接输出给操作系统,sowin下以gbkansi为准,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为显示的月份信息。 ''' classCalendar: pass AppCal=Calendar() importtime defcalcFirstDayOfMonth(year,month,day): '''计算某一日的是星期几''' months=(0,31,59,90,120,151,181,212,243,273,304,334) if0<=month<=12: sum=months[month-1] else: print'dataerror' #对年月做了判断,日只是加了上下限,没有根据月判断输入的是否合法 ifyear<0ormonth<0ormonth>11orday<0orday>31: importos 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 defcreateMonth(master): '''创建日历''' foriinrange(5): forjinrange(7): Label(master,text='').grid(row=i+2,column=j) defupdateDate(): '''更新日历''' #得到当前选择的日期 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) foriinrange(5): forjinrange(7): root.grid_slaves(i+2,j)[0]['text']='' foriinrange(1,months[month-1]+1): root.grid_slaves((i+fd-1)/7+2,(i+fd-1)%7)[0]['text']=str(i) defdrawHeader(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.'] forweekinweeks: Label(master,text=week).grid(row=1,column=weeks.index(week)) fromTkinterimport* root=Tk() drawHeader(root) createMonth(root) updateDate() root.mainloop()
感兴趣的朋友可以调试运行一下本文实例,并根据自身需求对代码加以改进和完善。