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模块学习 filecmp 文件比较
Aug 27 Python
python随机生成指定长度密码的方法
Apr 04 Python
Python解析nginx日志文件
May 11 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
Python给图像添加噪声具体操作
Mar 03 Python
python标记语句块使用方法总结
Aug 05 Python
python使用socket 先读取长度,在读取报文内容示例
Sep 26 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
Dec 12 Python
Python有参函数使用代码实例
Jan 06 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
python转化excel数字日期为标准日期操作
Jul 14 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调用mysql数据 dbclass类
2011/05/07 PHP
PHP之短标签开启设置
2013/06/17 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
PHP开发中AJAX技术的简单应用
2015/12/11 PHP
PHP实现简易图形计算器
2020/08/28 PHP
javascript indexOf函数使用说明
2008/07/03 Javascript
JQuery入门——用one()方法绑定事件处理函数(仅触发一次)
2013/02/05 Javascript
jquery内置验证(validate)使用方法示例(表单验证)
2013/12/04 Javascript
JS(JQuery)操作Array的相关方法介绍
2014/02/11 Javascript
jQuery切换所有复选框选中状态的方法
2015/07/02 Javascript
javascript文件加载管理简单实现方法
2015/07/25 Javascript
jQuery实现点击小图显示大图代码分享
2015/08/25 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
js省市县三级联动效果实例
2020/04/15 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
js模拟微博发布消息
2017/02/23 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
2020/05/27 Javascript
Python装饰器入门学习教程(九步学习)
2016/01/28 Python
python实现斐波那契数列的方法示例
2017/01/12 Python
对python的文件内注释 help注释方法
2018/05/23 Python
python 在某.py文件中调用其他.py内的函数的方法
2019/06/25 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python如何将函数值赋给变量
2020/04/28 Python
详解Html5页面实现下载文件(apk、txt等)的三种方式
2018/10/22 HTML / CSS
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
诗普兰迪官方网站:Splendid
2018/09/18 全球购物
Anthropologie英国:美国家喻户晓的休闲服装和家居产品品牌
2018/12/05 全球购物
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
副总经理岗位职责范本
2014/09/30 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
美术教师个人总结
2015/02/06 职场文书
2015年度高中教师工作总结
2015/05/26 职场文书
少先队中队工作总结2015
2015/07/23 职场文书
Java数据结构之堆(优先队列)
2022/05/20 Java/Android
Vue深入理解插槽slot的使用
2022/08/05 Vue.js