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实现抓取网页并且解析的实例
Sep 20 Python
详解Python编程中基本的数学计算使用
Feb 04 Python
Python中应该使用%还是format来格式化字符串
Sep 25 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
kafka-python批量发送数据的实例
Dec 27 Python
python实现趣味图片字符化
Apr 30 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
ERLANG和PYTHON互通实现过程详解
Jul 05 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
May 15 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
Nov 17 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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基于CURL进行POST数据上传实例
2014/11/10 PHP
PHPExcel导出2003和2007的excel文档功能示例
2017/01/04 PHP
yii2 commands模式以及配置crontab定时任务的方法
2017/08/19 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
CentOS7.0下安装PHP5.6.30服务的教程详解
2018/09/29 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
PHP面向对象程序设计重载(overloading)操作详解
2019/06/13 PHP
PHP 实现缩略图
2021/03/09 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
js中return false(阻止)的用法
2013/08/14 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
Javascript与jQuery方法的隐藏与显示
2015/01/19 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
jQuery 遍历map()方法详解
2016/11/04 Javascript
jQuery实现弹幕效果
2017/02/17 Javascript
解决node.js含有%百分号时发送get请求时浏览器地址自动编码的问题
2019/11/20 Javascript
JavaScript类的继承多种实现方法
2020/05/30 Javascript
纯js+css实现在线时钟
2020/08/18 Javascript
浅谈python新手中常见的疑惑及解答
2016/06/14 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
python selenium firefox使用详解
2019/02/26 Python
详解python中的线程与线程池
2019/05/10 Python
NumPy中的维度Axis详解
2019/11/26 Python
如何在django中实现分页功能
2020/04/22 Python
Django权限设置及验证方式
2020/05/13 Python
百丽国际旗下购物网站:优购
2017/02/28 全球购物
瑞典廉价机票预订网站:Seat24
2018/06/19 全球购物
Weblogc domain问题
2014/01/27 面试题
程序员机试试题汇总
2012/03/07 面试题
《逃家小兔》教学反思
2014/02/23 职场文书
英语专业职业生涯规划范文
2014/03/05 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
儿子满月酒致辞
2015/07/29 职场文书
创业计划之特色精品店
2019/08/12 职场文书
分析SQL窗口函数之排名窗口函数
2022/04/21 Oracle
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技