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中__str__和__repr__方法的区别
Apr 17 Python
Python实现控制台输入密码的方法
May 29 Python
解读Python编程中的命名空间与作用域
Oct 16 Python
python抓取网页中图片并保存到本地
Dec 01 Python
Python实现注册登录系统
Aug 08 Python
python XlsxWriter模块创建aexcel表格的实例讲解
May 03 Python
python 解压pkl文件的方法
Oct 25 Python
python通过移动端访问查看电脑界面
Jan 06 Python
pytorch 利用lstm做mnist手写数字识别分类的实例
Jan 10 Python
pycharm-professional-2020.1下载与激活的教程
Sep 21 Python
python自动化测试三部曲之unittest框架的实现
Oct 07 Python
python数据可视化使用pyfinance分析证券收益示例详解
Nov 20 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
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
详解php中反射的应用
2016/03/15 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
完美解决Thinkphp3.2中插入相同数据的问题
2017/08/01 PHP
php删除二维数组中的重复值方法
2018/03/12 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
用JavaScript隐藏控件的方法
2009/09/21 Javascript
functional继承模式 摘自javascript:the good parts
2011/06/20 Javascript
JavaScript作用域链使用介绍
2013/08/29 Javascript
JS中typeof与instanceof之间的区别总结
2013/11/14 Javascript
jquery全选checkBox功能实现代码(取消全选功能)
2013/12/10 Javascript
jquery获取复选框被选中的值
2014/03/22 Javascript
借助javascript代码判断网页是静态还是伪静态
2014/05/05 Javascript
javascript轻量级模板引擎juicer使用指南
2014/06/22 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
JavaScript中的关联数组问题
2015/03/04 Javascript
jQuery插件ajaxFileUpload实现异步上传文件效果
2015/04/14 Javascript
用Move.js配合创建CSS3动画的入门指引
2015/07/22 Javascript
JavaScript来实现打开链接页面的简单实例
2016/06/02 Javascript
判断数组的最佳方法(推荐)
2016/10/11 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
nodejs async异步常用函数总结(推荐)
2017/11/17 NodeJs
vue删除html内容的标签样式实例
2018/09/13 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
为Python的web框架编写MVC配置来使其运行的教程
2015/04/30 Python
Pycharm学习教程(2) 代码风格
2017/05/02 Python
python  logging日志打印过程解析
2019/10/22 Python
金融专业个人的自我评价
2013/10/18 职场文书
《桃花心木》教学反思
2014/02/17 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
Tomcat项目启动失败的原因和解决办法
2022/04/20 Servers