从Python Tkinter条目小部件检查日期格式

时间:2018-07-28 14:09:00

标签: python-3.x tkinter

使用Tkinter输入框,我要求用户输入YYYYMMDD格式的日期。 我想检查日期是否以正确的格式输入,否则引发错误框。以下函数将检查整数,但仅在下一步需要一些帮助,即日期格式。

    def retrieve_inputBoxes():
        startdate = self.e1.get()  # gets the startdate value from input box
        enddate = self.e2.get()    # gets the enddate value from input box
        if startdate.isdigit() and enddate.isdigit():
           pass
        else:
            tkinter.messagebox.showerror('Error Message', 'Integer Please!')
            return     

2 个答案:

答案 0 :(得分:1)

最简单的方法可能是使用正则表达式。但是,YYYYMMDD显然是一种不常见的格式,我发现的正则表达式很复杂。这是匹配格式YYYY-MM-DD的正则表达式的示例:

import re

text = input('Input a date (YYYY-MM-DD): ')
pattern = r'(19|20)\d\d[- /.](0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])'
match = re.search(pattern, text)
if match:
    print(match.group())
else:
    print('Wrong format')

此正则表达式将在20世纪和21世纪使用,并且不会在意每个月有多少天,只是最大数量为31。

答案 1 :(得分:1)

可能您已经解决了这个问题,但是如果任何人都面临同样的问题,您还可以使用datetime方法并使用{将从输入小部件检索到的数据转换为strptime格式{1}}语句以捕获异常,例如:

try

请注意,将产生的输出字符串将类似于from datetime import * def retrieve_inputBoxes(): try: startdate = datetime.strptime(self.e1.get(), '%Y-%m-%d') enddate = datetime.strptime(self.e2.get(), '%Y-%m-%d') except: print('Wrong datetime format, must be YYYY-MM-DD') else: print('startdate: {}, enddate: {}').format(startdate, enddate) ,您可以按以下方式截断该字符串,仅获取日期:

YYYY-MM-DD HH:MM:SS.ssssss

在我看来,此方法比Regex方法更好,因为该方法还可以检测用户是否尝试输入无效值(例如2019-04- 31 )或出现leap年的情况涉及(例如2019-02-29 =无效,2020-02-29 =有效)。