使用 Tkinter 在 Python 中创建年龄计算器

2025 年 3 月 17 日 | 阅读 28 分钟

在下面的教程中,我们将学习如何使用 Python 编程语言中的 Tkinter 库构建一个年龄计算器。

但在我们开始之前,让我们先了解什么是年龄计算器以及它是如何工作的。

什么是年龄计算器?

年龄计算器是一个工具,允许用户根据给定的出生日期计算一个人在特定日期的年龄。根据所属文化的不同,计算一个人年龄的方法也多种多样。然而,大多数西方文化采用年龄系统,即如果一个人活了 13 年 9 个月,则其年龄为 13 岁。此声明意味着一个人的年龄在其生日时增加 1 岁。

了解年龄计算器的工作原理

牛津词典中的定义是:“年龄”是一个人或事物存在的时间长度。年龄计算方法包括将一个人的出生日期与需要计算年龄的日期进行比较。因此,一个人的年龄等于给定日期减去出生日期。以下等式说明了这一点。

个人年龄 = 给定日期 - 出生日期(D.O.B.)

以下是允许我们计算某人从出生日期到给定日期的年龄的步骤

第 1 步: 首先,我们将找到指定年份与出生年份之间的差值,即 指定年份 - 出生年份。请注意,考虑的是完全完成的年份。

第 2 步: 其次,我们将估计剩余的月份数。由于我们只考虑完全完成的年份,因此将有一些月份被遗漏,需要进行估计。

第 3 步: 最后,我们将考虑剩余的天数。这为我们提供了一个人最终的年龄。它以年、月和日表示。

Python 年龄计算程序

现在让我们创建一个 Python 程序来计算当前日期的年龄。我们将定义一个函数来计算给定数据的年龄。稍后我们将修改此函数并将其用于本教程后面借助 Python Tkinter 库构建的应用程序中。

示例

输出

Simple Age Calculator
Enter the birth year: 2003
Enter the birth month: 10
Enter the birth day: 25
Age: 18 Years 3 Months and 7 days

说明

在上面的代码片段中,我们从 datetime 库中导入了 date 模块。然后我们定义了一个名为 calculate_age() 的函数,它接受一个参数 'birthday'。在这个函数中,我们使用 date 模块的 today() 方法获取了当前日期。然后我们检查了当前日期和月份是否小于出生日期和月份,并将布尔结果存储在一个名为 day_check 的变量中。然后我们计算了当前年份与出生年份之间的差值。然而,这个差值还不够。为了使其正确,我们必须根据今天是否早于生日月份和日期,从年份差值中减去 01。这可以通过从存储在 year_diff 变量中的值中减去存储在 day_check 中的布尔值来完成。请注意,在此操作下,布尔值将从 True 转换为 1,从 False 转换为 0。我们还通过从当前月份中减去出生月份来计算剩余月份,并将绝对值存储在一个变量中。我们对计算剩余天数也做了同样的处理。然后我们为用户打印了计算出的年龄。然后我们定义了主函数。在这个函数中,我们为用户打印了一个开场白。然后我们要求用户输入年、月和日。然后我们使用 date() 方法将输入数据以日期格式存储。最后,我们调用了该函数来计算一个人的年龄。

让我们开始使用 Python 编程语言中的 Tkinter 构建年龄计算器。

项目先决条件

为了开始在 Python 中构建基于 GUI 的年龄计算器项目,我们将需要以下库。

  1. Tkinter - 此库将允许我们创建 GUI 窗口。
  2. Datetime - 此库将允许我们处理日期。

由于所有这些库都预装在 Python 中,因此我们无需单独安装它们。

使用 Python 中的 Tkinter 构建年龄计算器

为了更好地理解,在 Python 中构建年龄计算器的过程分为几个步骤。我们需要执行的步骤如下:

第一步: 我们将从导入所需的模块开始。

第 2 步: 然后我们将定义一些函数来操纵应用程序中的数据,并修改我们之前定义的计算年龄的函数。

第三步: 接着,我们将为应用程序创建一个主窗口。

第 4 步: 我们将向窗口添加小部件并设置事件触发器。

现在让我们详细了解这些步骤。

导入所需模块

首先,我们将导入所有必要的模块来帮助我们构建这个项目。这些模块包括用于向应用程序添加图形用户界面的 tkinter 模块,以及用于处理日期的 datetime 模块中的 date 类。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们从 tkinter 模块导入了所有小部件和模块。然后我们从 tkinter 导入了 messagebox 模块。最后,我们从 datetime 模块导入了 date 类。

定义在应用程序中操作日期的函数

一旦我们导入了项目所需的模块,是时候开始定义一些必要的函数了,这些函数将允许我们操作输入字段中提供的数据并计算结果年龄。这些函数包括设置不同的日期、设置当前日期、重置所有条目、检查错误和计算年龄。

现在让我们了解这些函数具体将做什么以及它们的实现代码。

设置不同日期的函数

此函数将允许我们配置给定日期行中禁用输入字段的状态为正常,以便用户可以手动输入他们喜欢的日期并计算该特定时期的年龄。

现在让我们考虑以下说明此操作的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们定义了一个名为 different_date() 的函数。在此函数中,我们使用了 config() 方法,并将给定日期行中输入字段的 state 参数以及 current_date_button 按钮的状态设置为 normal,将 different_date_button 按钮的状态设置为 disabled。这将允许用户手动输入这些字段中的数据。

设置当前日期的函数

此函数将允许我们将给定日期行中输入字段的状态暂时禁用回正常,在字段中设置当前日期,以便用户可以计算当前年龄。

现在让我们考虑以下说明此操作的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们定义了一个名为 different_date() 的函数。在此函数中,我们使用了 config() 方法,并将给定日期行中输入字段的 state 参数以及 current_date_button 按钮的状态设置为 disabled,将 different_date_button 按钮的状态设置为 normal。我们使用了 set() 方法并在此字段中设置了当前日期。

重置所有条目的函数

此函数将允许用户删除输入数据和计算结果,并将所有配置重置为正常。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们使用 delete() 方法删除了出生日期行输入字段中的输入数据。然后我们使用 config() 方法将给定日期行输入字段的 state 参数以及 current_date_button 按钮的值设置为 disabled,并将 different_date_button 按钮的值设置为 normal。然后我们将 StringVar() 类的对象的数值设置为当前日期,并将其显示在给定日期行的输入字段中。我们还将 StringVar() 类的另一个对象的值设置为一个空字符串,将其显示在结果行的结果中。然后我们使用 focus_set() 方法将焦点设置到 birth_year_field 字段。

重置功能

现在我们将定义另一个函数,当用户单击“重置”按钮时调用此函数。此函数将重置条目并显示一个显示成功消息的消息框。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们定义了一个名为 reset() 的函数。在该函数中,我们调用了 reset_entries() 函数。我们还使用 messagebox 模块的 showinfo() 方法显示了一个显示成功消息的消息框。

检查错误的函数

此函数将检查任何输入字段是否为空,并返回一个显示错误的消息框。

以下是演示相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们定义了一个名为 check_for_errors() 的函数。在此函数中,我们使用了 if 条件语句来检查是否有任何输入字段为空。如果是,我们使用了 messagebox 模块的 showerror() 方法来显示错误。然后我们调用了 reset_entries() 方法来重置输入字段并返回 -1

计算年龄的函数

此函数将允许用户计算一个人的年龄。此函数将从填充的输入字段中检索信息,并检查输入数据是否为日期,如果是,则计算该日期的年龄。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们定义了一个名为 calculate_age() 的函数。在此函数中,我们调用了 check_for_errors() 函数,并将返回值存储在一个变量 val 中。然后我们使用 if-else 条件语句检查 val 的值是否等于 -1。如果不是,我们使用 get() 方法检索输入数据,并将值存储为整数数据类型。然后我们使用 try-except 方法检查输入的日期是否正确。我们还检查了出生日期是否小于或等于给定日期,并计算了相应的年龄。为了计算年龄,我们从给定日期中减去出生日期,并将时间之间的天数存储在一个变量 days_left 中。然后我们将时间中的总秒数除以 (365.242 * 24 * 3600),并将结果值存储为整数数据类型。然后我们使用 set() 方法将年龄设置为 StringVar() 类的对象中的字符串值。如果出生日期超过给定日期,我们使用 messagebox 模块的 showerror() 方法显示错误,并调用 reset_entries() 函数重置已填写的条目。如果出生日期和给定日期不是日期格式,我们抛出一个异常,其中我们使用 messagebox 模块的 showerror() 方法显示错误,如果输入的日期超出范围,并再次调用 reset_entries() 函数。

为应用程序创建主窗口

现在我们将为应用程序创建主窗口。此窗口将显示我们稍后在本教程中创建的所有小部件,并允许我们与它们交互,以便我们可以借助图形用户界面计算任何人的年龄。我们可以使用 Tk() 类轻松创建一个这样的窗口。我们还将使用此类提供的一些方法设置标题、大小、位置和背景颜色。

让我们考虑以下代码片段,说明 Tk() 类的实现。

文件:ageCalci.py

说明

在上面的代码片段中,我们创建了 tkinter 模块的 Tk() 类的一个对象 gui_root。然后我们使用 gui_roottitle() 方法设置应用程序标题。我们还使用了 geometry() 方法设置应用程序的大小和位置。然后我们使用了 resizable() 方法,并将其参数值设置为零以禁用可调整大小选项以获得更好的 UI。我们使用 config() 方法配置了应用程序的背景颜色,并将 bg 参数的值设置为 "#FEECF"。最后,我们使用了 iconbitmap() 方法设置应用程序的图标。

向主窗口添加小部件并设置事件触发器

主窗口创建完成后,是时候添加不同的小部件来执行我们之前定义的各种功能了。这些小部件包括不同的标签、输入字段和按钮。我们还将添加一些框架,为上述小部件提供定义良好的结构。

让我们在下面的代码片段中查看这些小部件的实现。

添加框架

首先,我们将通过向应用程序添加一些框架开始,因为这些框架将为其他小部件提供结构。我们将使用 Frame() 小部件创建框架,并借助 pack() 方法将其放置在窗口上。

让我们考虑以下演示相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们使用 tkinter 模块的 Frame() 小部件创建了几个框架。我们将它们的 master 参数值设置为 gui_root,即 Tk() 类的对象和主窗口。我们还通过将它们的 bg 参数值指定为 #FEECCF 来设置背景颜色。最后,我们使用了 pack() 方法,并将 y 轴的填充设置为 10

现在让我们开始向这些框架添加小部件。

向第一个框架 - header_frame 添加小部件

我们将在此框架中添加一个标签以显示应用程序的标题。我们将使用 Label() 小部件创建一个标签,并借助 pack() 方法设置其在框架中的位置。

让我们考虑以下演示相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们使用 Label() 小部件创建了一个标签,并将其 master 参数的值设置为我们之前创建的 header_frame 框架。我们还设置了文本、字体、背景和前景颜色。最后,我们使用了 pack() 方法,并设置了标签在窗口上的位置。

向第二个框架 - entry_frame 添加小部件

现在我们将向第二个框架添加小部件。这些小部件将包括显示重要文本的标签、输入数据的输入字段以及一些用于操作这些输入字段的按钮。我们将使用 Label() 小部件创建标签,使用 Entry() 小部件创建输入字段,并使用 Button() 小部件创建按钮。我们还将使用 grid() 方法以网格格式在窗口上设置这些小部件。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们使用 Label() 小部件创建了一些标签,显示了年、月、日、出生日期和给定日期等详细信息。我们将这些小部件的 master 参数值设置为 entry_frame,这是我们之前创建的一个框架。然后我们使用 grid() 方法以网格方式在窗口上设置标签的位置。然后我们使用 date 模块的 today() 方法,并将年、月和日存储在不同的变量中。然后我们创建了一些 StringVar() 类的对象,将其主参数设置为 entry_frame 框架,并使用 set() 方法设置要显示在输入字段中的初始值。然后我们使用 Entry() 小部件创建输入字段,以便用户可以输入请求的信息。我们再次将这些小部件的 master 参数设置为 entry_frame,并将 textvariable 参数设置为 StringVar() 类的对象。然后我们使用 grid() 方法以网格格式在窗口上设置这些输入字段的位置。然后我们使用 Button() 小部件创建了两个按钮,以允许我们操作输入字段。我们再次将这些小部件的 master 参数值设置为 entry_frame,并将 command 参数设置为我们之前定义的函数。最后,我们使用 grid() 方法以网格格式在窗口上设置这些按钮的位置。我们还配置了这些小部件的字体样式和大小、背景和前景颜色。

向第三个框架 - result_frame 添加小部件

现在我们将向第三个框架添加小部件。这些小部件将包括显示结果的标签,以及一些用于调用函数以重置条目和计算年龄的按钮。我们将使用 Label() 小部件创建标签,并使用 Button() 小部件创建按钮。我们还将使用 grid() 方法以网格格式在窗口上设置这些小部件。

让我们考虑以下说明相同内容的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们创建了 StringVar() 类的一个对象,并使用 set() 方法将初始值设置为空字符串以显示在标签中。然后我们使用 Label() 小部件创建了标签来显示结果语句和结果年龄,并将其 master 参数设置为 result_frame,这是我们之前定义的一个框架。然后我们使用 grid() 方法以网格格式在窗口上设置这些标签的位置。我们还将一个标签的 textvariable 参数设置为 StringVar() 类的对象以显示结果。然后我们使用 Button() 小部件创建了两个按钮,用于调用函数以重置所有条目和计算年龄。最后,我们使用 grid() 方法以网格格式在窗口上设置这些按钮的位置。我们还配置了这些小部件的字体样式和大小、背景和前景颜色。

运行应用程序

现在我们将使用 Tk() 类的 mainloop() 方法来运行应用程序。以下是说明此操作的代码片段。

文件:ageCalci.py

说明

在上面的代码片段中,我们使用了 mainloop() 方法来运行应用程序。

现在项目代码已完成,是时候保存文件并运行以下命令来执行项目程序了。

语法

在我们查看结果之前,让我们先了解一下“使用 Tkinter 构建年龄计算器”程序的完整项目代码。

完整的项目代码

以下是“带 GUI 的年龄计算器”程序的完整项目代码。

文件:ageCalci.py

输出

Age Calculator using Tkinter in Python