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中常用的各种数据库操作模块和连接实例
May 29 Python
Python中关于字符串对象的一些基础知识
Apr 08 Python
windows10系统中安装python3.x+scrapy教程
Nov 08 Python
Python数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
Python数据分析之双色球中蓝红球分析统计示例
Feb 03 Python
使用python和pygame绘制繁花曲线的方法
Feb 24 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
python实现创建新列表和新字典,并使元素及键值对全部变成小写
Jan 15 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
Python 实现自动导入缺失的库
Oct 29 Python
详解Pandas 处理缺失值指令大全
Jul 30 Python
python绘制高斯曲线
Feb 19 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实现压缩多个CSS与JS文件的方法
2014/11/11 PHP
thinkphp实现163、QQ邮箱收发邮件的方法
2015/12/18 PHP
Thinkphp批量更新数据的方法汇总
2016/06/29 PHP
php二维码生成以及下载实现
2017/09/28 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
ExtJS的FieldSet的column列布局
2009/11/20 Javascript
niceTitle 基于jquery的超链接提示插件
2010/05/31 Javascript
JS焦点图切换,上下翻转
2011/05/12 Javascript
简短几句jquery代码的实现一个图片向上滚动切换
2011/09/02 Javascript
JavaScript静态类型检查工具FLOW简介
2015/01/06 Javascript
jquery Validation表单验证使用详解
2020/09/12 Javascript
js实现分割上传大文件
2016/03/09 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
js中判断变量类型函数typeof的用法总结
2016/08/09 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
Element Carousel 走马灯的具体实现
2020/07/26 Javascript
Vue scoped及deep使用方法解析
2020/08/01 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
Vue父组件监听子组件生命周期
2020/09/03 Javascript
Django框架中数据的连锁查询和限制返回数据的方法
2015/07/17 Python
Python实现字符串逆序输出功能示例
2017/06/24 Python
Windows下python3.7安装教程
2018/07/31 Python
3种python调用其他脚本的方法
2020/01/06 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
python实现将range()函数生成的数字存储在一个列表中
2020/04/02 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
Html5大文件断点续传实现方法
2015/12/05 HTML / CSS
"序列点" 是什么
2016/07/29 面试题
资产评估专业大学生求职信
2013/09/29 职场文书
淘宝客服自我总结鉴定
2014/01/25 职场文书
授权委托书格式
2014/07/31 职场文书
教师暑期培训感言
2014/08/15 职场文书
保送生自荐信范文
2015/03/26 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers