本文講述了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()
感興趣的朋友可以調試運行一下本文實例,并根據自身需求對代碼加以改進和完善。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

