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 06 Python
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
python人人网登录应用实例
Sep 26 Python
python获取外网ip地址的方法总结
Jul 02 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
点球小游戏python脚本
May 22 Python
对Python3.x版本print函数左右对齐详解
Dec 22 Python
Python字符串格式化输出代码实例
Nov 22 Python
python获取响应某个字段值的3种实现方法
Apr 30 Python
使用ITK-SNAP进行抠图操作并保存mask的实例
Jul 01 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
Django如何使用asyncio协程和ThreadPoolExecutor多线程
Oct 12 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使用session二维数组实例
2014/11/06 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
PHP合并数组函数array_merge用法分析
2017/02/17 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
juqery 学习之三 选择器 可见性 元素属性
2010/11/25 Javascript
获取offsetTop和offsetLeft值的js代码(兼容)
2013/04/16 Javascript
jQuery的3种请求方式$.post,$.get,$.getJSON
2014/03/28 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
学习JavaScript设计模式之迭代器模式
2016/01/19 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
详解angular ui-grid之过滤器设置
2017/06/07 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
Vue SPA单页应用首屏优化实践
2018/06/28 Javascript
详解Axios 如何取消已发送的请求
2018/10/20 Javascript
解决JavaScript中0.1+0.2不等于0.3问题
2018/10/23 Javascript
详解微信小程序文件下载--视频和图片
2019/04/24 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
2020/05/19 Javascript
[00:12]DAC SOLO赛卫冕冠军 VG.Paparazi灬展现SOLO技巧
2018/04/06 DOTA
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
2013/01/17 Python
在Django的视图中使用form对象的方法
2015/07/18 Python
Python基于Socket实现的简单聊天程序示例
2017/08/05 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
Django websocket原理及功能实现代码
2020/11/14 Python
马来西亚在线时尚女装商店:KEI MAG
2017/09/28 全球购物
Guess美国官网:美国知名服装品牌
2019/04/08 全球购物
Kathmandu新西兰官网:新西兰户外运动品牌
2019/07/27 全球购物
司法助理专业自荐书
2014/06/13 职场文书
招标授权委托书样本
2014/09/23 职场文书
2015年计划生育责任书
2015/05/08 职场文书
军训决心书范文
2015/09/22 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书