Python制作简易版小工具之计算天数的实现思路


Posted in Python onFebruary 13, 2020

需求

给定一个日期,格式如 “2020-2-12”,计算出这个日期是 2020 年的第几天?

实现思路

  1. 使用 tkinter 和 tkinter.ttk 对界面进行布置;
  2. 使用 calendar 计算天数;
  3. 规范输入日期的格式;
  4. 对月份,天数进行逻辑判断;
  5. 输入错误抛出异常提示。

代码实现

# -*- coding: utf-8 -*-
'''
@File: calc_day_v2.py
@Time: 2020/02/12 20:33:22
@Author: 大梦三千秋
@Contact: yiluolion@126.com
'''
# Put the import lib here
from tkinter import *
import tkinter.messagebox as messagebox
from tkinter import ttk
import calendar
class MyException(BaseException):
  '''自定义异常类
  '''
  def __init__(self, message):
    self.message = message
def calculate(*args):
  '''计算天数方法
  '''
  try:
    # 用以存储天数
    nums = 0
    # 获取输入框中的数据
    year, month, day = [int(elem) for elem in date.get().split('-')]
    # 判断月份,规定在 1-12 之间
    if 1 <= month <= 12:
      # 遍历计算天数
      for month_x in range(1, month + 1):
        # 计算每月的天数
        _, month_day = calendar.monthrange(year, month_x)
        # 遍历的月份等于当前月份,对天数进行规整
        if month_x == month:
          # 文本输入框给出的天数不符合,则抛出异常
          if day > month_day:
            raise MyException("信息输入错误,注意天数!")
          continue
        nums += month_day
      nums += day
      # 设置值到文本框
      days.set(nums)
      the_year.set(year)
    else: # 月份超出范围抛出异常
      raise MyException("信息输入错误,注意月份!")
  except MyException as e:
    messagebox.showinfo(title="输入信息错误", message=e)
  except Exception as e:
    # print(e)
    messagebox.showinfo(title="输入信息错误", message="输出格式错误,按照 2020-2-12 这样的格式输入。注意月份,天数!")
root = Tk()
root.title("计算天数")
# 设置框架
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, S, E, W))
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)
date = StringVar()
the_year = StringVar()
days = StringVar()
# 文本框部件布置
date_entry = ttk.Entry(mainframe, width=10, textvariable=date)
date_entry.grid(column=2, row=1, sticky=(W, E))
# 标签及按钮的布置
ttk.Label(mainframe, text="例如:2020-2-12").grid(column=5, row=1, sticky=(W, E))
ttk.Label(mainframe, textvariable=days).grid(column=4, row=2, sticky=(W, E))
ttk.Label(mainframe, textvariable=the_year).grid(column=2, row=2, sticky=(W, E))
ttk.Button(mainframe, text="Calculate", command=calculate).grid(column=5, row=3)
ttk.Label(mainframe, text="日期:").grid(column=1, row=1, sticky=E)
ttk.Label(mainframe, text="这一天是").grid(column=1, row=2, sticky=E)
ttk.Label(mainframe, text="年的第").grid(column=3, row=2, sticky=E)
ttk.Label(mainframe, text="天").grid(column=5, row=2, sticky=W)
# 设置内边距
for child in mainframe.winfo_children():
  child.grid_configure(padx=5, pady=5)
date_entry.focus()
root.bind('<Return>', calculate)
root.mainloop()

使用效果

正确输入的效果如下:

 Python制作简易版小工具之计算天数的实现思路

未按照格式输入,错误提示效果:

 Python制作简易版小工具之计算天数的实现思路

月份输入错误,提示效果如下:

 Python制作简易版小工具之计算天数的实现思路

天数超出当月范围的错误提示效果:

 Python制作简易版小工具之计算天数的实现思路

本篇的内容主要是对昨天的 tkinter 模块的延展使用,实现一个计算天数的小工具。

以上所述是小编给大家介绍的Python制作简易版小工具之计算天数的实现思路,希望对大家有所帮助!

Python 相关文章推荐
Python读取一个目录下所有目录和文件的方法
Jul 15 Python
pandas中的DataFrame按指定顺序输出所有列的方法
Apr 10 Python
使用EduBlock轻松学习Python编程
Oct 08 Python
ubuntu 16.04下python版本切换的方法
Jun 14 Python
python自动循环定时开关机(非重启)测试
Aug 26 Python
pytorch中的上采样以及各种反操作,求逆操作详解
Jan 03 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
Python3 ID3决策树判断申请贷款是否成功的实现代码
May 21 Python
解决导入django_filters不成功问题No module named 'django_filter'
Jul 15 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 Python
Python批量将csv文件转化成xml文件的实例
May 10 Python
Python实现滑雪小游戏
Sep 25 Python
解决python-docx打包之后找不到default.docx的问题
Feb 13 #Python
Python更新所有已安装包的操作
Feb 13 #Python
python离线安装外部依赖包的实现
Feb 13 #Python
python获取依赖包和安装依赖包教程
Feb 13 #Python
python连接mongodb集群方法详解
Feb 13 #Python
安装完Python包然后找不到模块的解决步骤
Feb 13 #Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
Feb 13 #Python
You might like
收集的二十一个实用便利的PHP函数代码
2010/04/22 PHP
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
PHP Session机制简介及用法
2014/08/19 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
PHP定时执行任务的3种方法详解
2015/12/21 PHP
php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法
2016/03/23 PHP
php+redis实现多台服务器内网存储session并读取示例
2017/01/12 PHP
javascript操作cookie的文章(设置,删除cookies)
2010/04/01 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
关闭浏览器输入框自动补齐 兼容IE,FF,Chrome等主流浏览器
2014/02/11 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
JavaScript运行过程中的“预编译阶段”和“执行阶段”
2015/12/16 Javascript
svg动画之动态描边效果
2017/02/22 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
iview给radio按钮组件加点击事件的实例
2017/09/30 Javascript
Vue批量图片显示时遇到的路径被解析问题
2019/03/28 Javascript
Vue开发Html5微信公众号的步骤
2019/04/11 Javascript
JS实现水平移动与垂直移动动画
2019/12/19 Javascript
解读Django框架中的低层次缓存API
2015/07/24 Python
Python复制文件操作实例详解
2015/11/10 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
python读取几个G的csv文件方法
2019/01/07 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
PyQt5实现类似别踩白块游戏
2019/01/24 Python
python实现转圈打印矩阵
2019/03/02 Python
Pytorch 多维数组运算过程的索引处理方式
2019/12/27 Python
利用SVG和CSS3来实现一个炫酷的边框动画
2015/07/22 HTML / CSS
您的网上新华书店:文轩网
2016/08/24 全球购物
GAZMAN官网:澳大利亚领先的男装品牌
2019/12/19 全球购物
护理专科毕业推荐信
2013/11/10 职场文书
借款协议书范本
2014/04/22 职场文书
大学班级学风建设方案
2014/05/01 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
Springboot使用Spring Data JPA实现数据库操作
2021/06/30 Java/Android