Python创建日历实例


Posted in Python onAugust 21, 2014

本文讲述了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()

感兴趣的朋友可以调试运行一下本文实例,并根据自身需求对代码加以改进和完善。

Python 相关文章推荐
python 控制语句
Nov 03 Python
详解Python中的正则表达式的用法
Apr 09 Python
Python入门_浅谈逻辑判断与运算符
May 16 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
答题辅助python代码实现
Jan 16 Python
python 读取竖线分隔符的文本方法
Dec 20 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
pandas read_excel()和to_excel()函数解析
Sep 19 Python
如何基于python实现归一化处理
Jan 20 Python
python 使用事件对象asyncio.Event来同步协程的操作
May 04 Python
matplotlib阶梯图的实现(step())
Mar 02 Python
Python手拉手教你爬取贝壳房源数据的实战教程
May 21 Python
Python实现批量把SVG格式转成png、pdf格式的代码分享
Aug 21 #Python
python生成日历实例解析
Aug 21 #Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
Aug 21 #Python
Python中除法使用的注意事项
Aug 21 #Python
Python中dictionary items()系列函数的用法实例
Aug 21 #Python
Python 不同对象比较大小示例探讨
Aug 21 #Python
python字符串连接方式汇总
Aug 21 #Python
You might like
Parse正式发布开源PHP SDK
2014/08/11 PHP
PHP整合PayPal支付
2015/06/11 PHP
Zend Framework动作助手Json用法实例分析
2016/03/05 PHP
laravel5.6实现数值转换
2019/10/23 PHP
PHP8.0新功能之Match表达式的使用
2020/07/19 PHP
常用js脚本
2006/12/03 Javascript
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
jquery果冻抖动效果实现方法
2015/01/15 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
vux uploader 图片上传组件的安装使用方法
2018/05/15 Javascript
eslint 的三大通用规则详解
2019/05/16 Javascript
微信小程序中网络请求缓存的解决方法
2019/12/29 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
Python实现的双色球生成功能示例
2017/12/18 Python
示例详解Python3 or Python2 两者之间的差异
2018/08/23 Python
Python中logging实例讲解
2019/01/17 Python
Python线程之定位与销毁的实现
2019/02/17 Python
python中对数据进行各种排序的方法
2019/07/02 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
购买正版游戏和游戏激活码:Green Man Gaming
2019/11/06 全球购物
网络安全方面的面试题
2016/01/07 面试题
咖啡店自主创业商业计划书
2014/01/22 职场文书
活动志愿者自荐信
2014/01/27 职场文书
师范学院美术系毕业生自我鉴定
2014/01/29 职场文书
法律六进活动方案
2014/03/13 职场文书
奥巴马获胜演讲稿
2014/05/15 职场文书
司法所长先进事迹
2014/06/02 职场文书
2014年党员教师自我剖析材料
2014/09/30 职场文书
第二批党的群众路线教育实践活动总结报告
2014/10/30 职场文书
党的群众路线教育实践活动制度建设计划方案
2014/10/31 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2016国培学习心得体会
2016/01/08 职场文书
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers