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获取Linux系统的各种信息
Jul 10 Python
Python with用法实例
Apr 14 Python
Python3写入文件常用方法实例分析
May 22 Python
详解Django框架中用context来解析模板的方法
Jul 20 Python
Python中使用platform模块获取系统信息的用法教程
Jul 08 Python
浅谈Python基础—判断和循环
Mar 22 Python
python开发游戏的前期准备
May 05 Python
python pytest进阶之conftest.py详解
Jun 27 Python
Pytorch之parameters的使用
Dec 31 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
Python基于requests实现模拟上传文件
Apr 21 Python
这样写python注释让代码更加的优雅
Jun 02 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
phpMyAdmin 安装配置方法和问题解决
2009/06/08 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
2014/10/15 PHP
php中substr()函数参数说明及用法实例
2014/11/15 PHP
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
Jquery创建层显示标题和内容且随鼠标移动而移动
2014/01/26 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
Vue.js实现一个自定义分页组件vue-paginaiton
2016/09/05 Javascript
浅谈js中同名函数和同名变量的执行问题
2017/02/12 Javascript
Vue学习笔记进阶篇之多元素及多组件过渡
2017/07/19 Javascript
bootstrap datepicker插件默认英文修改为中文
2017/07/28 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
js实现计时器秒表功能
2019/12/16 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Vue filter 过滤器、以及在table中的使用介绍
2020/09/07 Javascript
[02:14]2016国际邀请赛中国区预选赛Ehome晋级之路
2016/07/01 DOTA
python 随机数生成的代码的详细分析
2011/05/15 Python
重命名批处理python脚本
2013/04/05 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python金融数据可视化汇总
2017/11/17 Python
用Python写王者荣耀刷金币脚本
2017/12/21 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
VSCode中自动为Python文件添加头部注释
2019/11/14 Python
基于python 将列表作为参数传入函数时的测试与理解
2020/06/05 Python
如何让PyQt5中QWebEngineView与JavaScript交互
2020/10/21 Python
Bowflex美国官方网站:高级家庭健身器材
2017/12/22 全球购物
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
2014迎国庆标语大全
2014/09/19 职场文书
班主任师德师风自我剖析材料
2014/10/02 职场文书
2014年财务工作总结范文
2014/11/11 职场文书
班主任培训研修日志
2015/11/13 职场文书
乡镇团代会开幕词
2016/03/04 职场文书
HTML基础-标签分类(闭合标签,空标签,块级元素,行内元素,行级块元素,可替换元素)
2021/03/31 HTML / CSS
goland 清除所有的默认设置操作
2021/04/28 Golang
CSS font-variation 可变字体的魅力(实例详解)
2022/03/03 HTML / CSS