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的Django框架中用流响应生成CSV文件的教程
May 02 Python
Python定时器实例代码
Nov 01 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
使用pip安装python库的多种方式
Jul 31 Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 Python
Python concurrent.futures模块使用实例
Dec 24 Python
Python流程控制常用工具详解
Feb 24 Python
pycharm 对代码做静态检查操作
Jun 09 Python
Python3.8安装Pygame教程步骤详解
Aug 14 Python
多个版本的python共存时使用pip的正确做法
Oct 26 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 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
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
laravel实现登录时监听事件,添加登录用户的记录方法
2019/09/30 PHP
一句话JavaScript表单验证代码
2009/08/02 Javascript
生成二维码方法汇总
2014/12/26 Javascript
Nodejs中解决cluster模块的多进程如何共享数据问题
2016/11/10 NodeJs
js实现右键自定义菜单
2016/12/03 Javascript
JS 学习总结之正则表达式的懒惰性和贪婪性
2017/07/03 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
vue axios请求拦截实例代码
2018/03/29 Javascript
微信小程序实现折叠与展开文章功能
2018/06/12 Javascript
小程序红包雨的实现示例
2019/02/19 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
Python类的专用方法实例分析
2015/01/09 Python
python根据出生日期返回年龄的方法
2015/03/26 Python
深入理解Python中字典的键的使用
2015/08/19 Python
python 自动化将markdown文件转成html文件的方法
2016/09/23 Python
Python eval的常见错误封装及利用原理详解
2019/03/26 Python
python Popen 获取输出,等待运行完成示例
2019/12/30 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
html5 video标签屏蔽右键视频另存为的js代码
2013/11/12 HTML / CSS
深入解析HTML5中的Blob对象的使用
2015/09/08 HTML / CSS
美国婚礼装饰和活动用品批发供应商:Event Decor Direct
2018/10/12 全球购物
Melissa鞋英国官方网站:Nonnon
2019/05/01 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
给国外客户的邀请函
2014/01/30 职场文书
信息学院毕业生自荐信范文
2014/03/04 职场文书
学生自我评语大全
2014/04/18 职场文书
员工加薪申请报告
2015/05/15 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS