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 相关文章推荐
PyQt5每天必学之像素图控件QPixmap
Apr 19 Python
python顺序执行多个py文件的方法
Jun 29 Python
python框架flask表单实现详解
Nov 04 Python
python GUI库图形界面开发之PyQt5日期时间控件QDateTimeEdit详细使用方法与实例
Feb 27 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
Mar 20 Python
python将字典内容写入json文件的实例代码
Aug 12 Python
python 常用日期处理-- datetime 模块的使用
Sep 02 Python
Python中Selenium模块的使用详解
Oct 09 Python
Python为何不支持switch语句原理详解
Oct 21 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
Jan 21 Python
Python使用random模块实现掷骰子游戏的示例代码
Apr 29 Python
实例详解Python的进程,线程和协程
Mar 13 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
杏林同学录(二)
2006/10/09 PHP
php获得当前的脚本网址
2007/12/10 PHP
nginx+thinkphp下解决不支持pathinfo模式
2015/07/01 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
2018/08/07 PHP
PHP连接SQL Server的方法分析【基于thinkPHP5.1框架】
2019/05/06 PHP
第一章之初识Bootstrap
2016/04/25 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
JS实现直接运行html代码的方法
2017/03/13 Javascript
详解打造 Vue.js 可复用组件
2017/03/24 Javascript
js实现移动端编辑添加地址【模仿京东】
2017/04/28 Javascript
Node.js readline模块与util模块的使用
2018/03/01 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
vue车牌号校验和银行校验实战
2019/01/23 Javascript
js实现视图和数据双向绑定的方法分析
2020/02/05 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
[02:39]DOTA2英雄基础教程 极限穿梭编织者
2013/12/05 DOTA
[01:33:25]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第一场 1月24日
2021/03/11 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
利用python开发app实战的方法
2019/07/09 Python
Kears+Opencv实现简单人脸识别
2019/08/28 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
Python 日期与时间转换的方法
2020/08/01 Python
Django-Scrapy生成后端json接口的方法示例
2020/10/06 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
请写出一段Python代码实现删除一个list里面的重复元素
2015/12/29 面试题
婚庆公司的创业计划书
2014/01/22 职场文书
春风行动实施方案
2014/03/28 职场文书
物资采购方案
2014/06/12 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
停水通知
2015/04/16 职场文书