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 21 Python
Python专用方法与迭代机制实例分析
Sep 15 Python
python uuid模块使用实例
Apr 08 Python
使用python采集脚本之家电子书资源并自动下载到本地的实例脚本
Oct 23 Python
python list格式数据excel导出方法
Oct 31 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
Django时区详解
Jul 24 Python
解决django FileFIELD的编码问题
Mar 30 Python
TensorFlow实现批量归一化操作的示例
Apr 22 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
Mar 02 Python
Pygame Event事件模块的详细示例
Nov 17 Python
Python数据结构之队列详解
Mar 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
重置版游戏视频
2020/04/09 魔兽争霸
用缓存实现静态页面的测试
2006/12/06 PHP
php获取mysql数据库中的所有表名的代码
2011/04/23 PHP
php中利用str_pad函数生成数字递增形式的产品编号
2013/09/30 PHP
Windows下的PHP 5.3.x安装 Zend Guard Loader教程
2014/09/06 PHP
PHP汉字转换拼音的函数代码
2015/12/30 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
html的DOM中document对象anchors集合用法实例
2015/01/21 Javascript
jQuery实现选中弹出窗口选择框内容后赋值给文本框的方法
2015/11/23 Javascript
javascript图片预加载完整实例
2015/12/10 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
2017/06/29 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Vue 实现前进刷新后退不刷新的效果
2019/06/14 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
JavaScript异步操作的几种常见处理方法实例总结
2020/05/11 Javascript
vue实现简单跑马灯效果
2020/05/25 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
python的dataframe转换为多维矩阵的方法
2018/04/11 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
基于python cut和qcut的用法及区别详解
2019/11/22 Python
win10从零安装配置pytorch全过程图文详解
2020/05/08 Python
基于python实现模拟数据结构模型
2020/06/12 Python
详解Flask前后端分离项目案例
2020/07/24 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
深深扎根运动世界的生活品牌:Tillys
2017/10/30 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
大学生自荐信怎么写
2015/03/26 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
Golang中interface{}转为数组的操作
2021/04/30 Golang