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将xml xsl文件生成html文件存储示例讲解
Dec 03 Python
python求pi的方法
Oct 08 Python
Python生成随机MAC地址
Mar 10 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
python使用tensorflow保存、加载和使用模型的方法
Jan 31 Python
Python生成器定义与简单用法实例分析
Apr 30 Python
简单了解python反射机制的一些知识
Jul 13 Python
python cv2截取不规则区域图片实例
Dec 21 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
GitHub上值得推荐的8个python 项目
Oct 30 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 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
Codeigniter实现发送带附件的邮件
2015/03/19 PHP
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
PHP登录(ajax提交数据和后台校验)实例分享
2016/12/29 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
2017/02/28 PHP
IE6下opacity与JQuery的奇妙结合
2013/03/01 Javascript
删除条目时弹出的确认对话框
2014/06/05 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
javascript设置文本框光标的方法实例小结
2016/11/04 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
vue侧边栏动态生成下级菜单的方法
2018/09/07 Javascript
vue 中Virtual Dom被创建的方法
2019/04/15 Javascript
解决layui弹出层layer的area过大被遮挡的问题
2019/09/21 Javascript
浅析Vue下的components模板使用及应用
2019/11/27 Javascript
Vue父子之间值传递的实例教程
2020/07/02 Javascript
Js图片点击切换轮播实现代码
2020/07/27 Javascript
[01:41]DOTA2 2015国际邀请赛中国区预选赛第三日战报
2015/05/28 DOTA
python代码检查工具pylint 让你的python更规范
2012/09/05 Python
python+opencv实现动态物体识别
2018/01/09 Python
浅谈pandas中shift和diff函数关系
2018/04/08 Python
python实现人民币大写转换
2018/06/20 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Python图像处理之图片文字识别功能(OCR)
2019/07/30 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
pytorch 实现张量tensor,图片,CPU,GPU,数组等的转换
2020/01/13 Python
使用Python操作ArangoDB的方法步骤
2020/02/02 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
html5 的a标签 Href 拨电话的写法
2013/11/04 HTML / CSS
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
物流仓储实习自我鉴定
2013/09/25 职场文书
会议主持词通用版
2019/04/02 职场文书
Python 解决空列表.append() 输出为None的问题
2021/05/23 Python
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
MyBatis配置文件解析与MyBatis实例演示
2022/04/07 Java/Android