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操作CouchDB的方法
Oct 08 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
详解python分布式进程
Oct 08 Python
django使用django-apscheduler 实现定时任务的例子
Jul 20 Python
详细介绍pandas的DataFrame的append方法使用
Jul 31 Python
win10系统下python3安装及pip换源和使用教程
Jan 06 Python
如何基于线程池提升request模块效率
Apr 18 Python
Python3合并两个有序数组代码实例
Aug 11 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
python selenium 获取接口数据的实现
Dec 07 Python
PyTorch梯度裁剪避免训练loss nan的操作
May 24 Python
浅谈Python数学建模之线性规划
Jun 23 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
实用函数7
2007/11/08 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP常用字符串函数小结(推荐)
2018/08/05 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
Yii框架学习笔记之session与cookie简单操作示例
2019/04/30 PHP
Yii2.0框架模型多表关联查询示例
2019/07/18 PHP
判断用户的在线状态 onbeforeunload事件
2011/03/05 Javascript
javascript实现的DES加密示例
2013/10/30 Javascript
JS实现切换标签页效果实例代码
2013/11/01 Javascript
javaScript 计算两个日期的天数相差(示例代码)
2013/12/27 Javascript
jquery实现非叠加式的搜索框提示效果
2014/01/07 Javascript
在页面加载完成后通过jquery给多个span赋值
2014/05/21 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
Js可拖拽放大的层拖动特效实现方法
2015/02/25 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
封装的dialog插件 基于bootstrap模态对话框的简单扩展
2016/08/10 Javascript
js模块加载方式浅析
2017/08/12 Javascript
vue 不使用select实现下拉框功能(推荐)
2018/05/17 Javascript
jQuery使用动画队列自定义动画操作示例
2018/06/16 jQuery
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
在python中bool函数的取值方法
2018/11/01 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
Python OpenCV中的numpy与图像类型转换操作
2020/12/11 Python
python pillow库的基础使用教程
2021/01/13 Python
新秀丽拉杆箱美国官方网站:Samsonite美国
2016/07/25 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
尊师重教演讲稿
2014/09/04 职场文书
出纳试用期工作总结2015
2015/05/28 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
Redis三种集群模式详解
2021/10/05 Redis
HTML5 新增内容和 API详解
2021/11/17 HTML / CSS
Android studio 简单计算器的编写
2022/05/20 Java/Android
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers