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 运算符 供重载参考
Jun 11 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python 功能和特点(新手必学)
Dec 30 Python
Python的Twisted框架中使用Deferred对象来管理回调函数
May 25 Python
利用numpy实现一、二维数组的拼接简单代码示例
Dec 15 Python
python matlibplot绘制3D图形
Jul 02 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
python使用paramiko实现ssh的功能详解
Mar 06 Python
基于python实现图片转字符画代码实例
Sep 04 Python
Python使用pyenv实现多环境管理
Feb 05 Python
Python中的turtle画箭头,矩形,五角星
Mar 16 Python
Python实现对齐打印 format函数的用法
Apr 28 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
sphinx增量索引的一个问题
2011/06/14 PHP
php中file_exists函数使用详解
2015/05/08 PHP
PHP中array_keys和array_unique函数源码的分析
2016/02/26 PHP
Laravel关系模型指定条件查询方法
2019/10/10 PHP
javascript parseInt() 函数的进制转换注意细节
2013/01/08 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
jqGrid日期格式的判断示例代码(开始日期与结束日期)
2013/11/08 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
让JavaScript和其它资源并发下载的方法
2014/10/16 Javascript
轻松创建nodejs服务器(6):作出响应
2014/12/18 NodeJs
Jquery ajax加载等待执行结束再继续执行下面代码操作
2015/11/24 Javascript
JavaScript操作选择对象的简单实例
2016/05/16 Javascript
jQuery焦点图左右转换效果
2016/12/12 Javascript
JavaScript自定义浏览器滚动条兼容IE、 火狐和chrome
2017/01/05 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
vscode中Vue别名路径提示的实现
2020/07/31 Javascript
Vue全局使用less样式,组件使用全局样式文件中定义的变量操作
2020/10/21 Javascript
详解Vue.js3.0 组件是如何渲染为DOM的
2020/11/10 Javascript
python进程类subprocess的一些操作方法例子
2014/11/22 Python
Python中有趣在__call__函数
2015/06/21 Python
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
Python进程池Pool应用实例分析
2019/11/27 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
个人自荐信
2013/12/05 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
学生会部长竞聘书
2014/03/31 职场文书
意外伤害赔偿协议书
2014/09/16 职场文书
2014年派出所工作总结
2014/11/21 职场文书
高三英语教学计划
2015/01/23 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
原生JS中应该禁止出现的写法
2021/05/05 Javascript
Goland使用Go Modules创建/管理项目的操作
2021/05/06 Golang
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL