一个通过Python实现的简单的年龄计算器

本文介绍了如何使用Python、PyQt或TkinterGUI框架、Datetime库以及Pyinstaller或cx_Freeze打包器在Windows10上开发和打包年龄计算器软件。通过创建图形界面、处理日期计算及打包成.exe文件,初学者可以学习到完整的开发流程。
摘要由CSDN通过智能技术生成

背景:

为了编写一个可以在Windows10上运行的年龄计算器的软件,你需要掌握以下的知识点和使用以下的工具:

  1. Python编程语言:Python是一门高级的动态编程语言,它具有简单易学、缩短程序开发周期、兼容多种操作系统等特点,因此在Windows 10系统下开发应用非常方便。

  2. PyQt或Tkinter GUI框架:Python编程语言本身提供的GUI (Graphical User Interface) 库非常基础,因此我们需要使用其他的工具来构建用户界面。目前常用的GUI框架有 Pyqt 和 tkinter。Pyqt是一款使用Python和Qt的库,而tkinter是Python自带的基本框架。

  3. Datetime库:使用Datetime库可以方便进行日期时间操作,例如计算年龄。

  4. Pyinstaller或cx_Freeze打包器:这些打包器可以将Python程序打包成Windows可执行文件(.exe)。

完成上述准备工作后,就可以开始编写年龄计算器程序了。首先需要了解一些基本的GUI布局知识点,例如窗口、标签、输入框、按钮等。其次,你需要编写计算器中的业务逻辑,即计算用户输入的日期信息并计算出其年龄。最后,你需要将程序打包成可在Windows 10系统上运行的exe文件。

总之,对于想要编写年龄计算器的Python初学者,需要掌握Python编程语言、GUI框架、Datetime库以及打包器等关键知识点,方可才能顺利地完成年龄计算器的开发。

设计方法:

要实现年龄计算器,你需要具备以下知识和使用以下工具:

  1. Python编程语言基础知识;
  2. GUI框架:PyQt或Tkinter;
  3. 时间日期处理相关的Python库:如datetime等;
  4. 将Python代码打包为可执行文件的工具:Pyinstaller或者cx_Freeze

以下是实现的步骤:

  1. 安装Python环境和相关库,可以到Python官网下载Python 3以及需要的第三方库(如PyQt5)。安装过程中可以选择将Python添加到系统PATH变量中,方便使用Python环境。

  2. 使用PyQt或Tkinter框架,设计图形用户界面(GUI),其中需要包括输入出生日期和当前日期的输入框和计算按钮,以及用于显示计算结果的标签或文本框等。

  3. 在Python代码中使用datetime库计算出年龄;

  4. 将Python代码打包为可执行文件,可以使用Pyinstaller或cx_Freeze等工具,例如:

Pyinstaller是一个可以将Python代码打包成单个可执行文件的工具。使用Pyinstaller可以方便地将Python项目部署到其他机器上,而无需安装Python解释器或其他依赖项。

以下是使用Pyinstaller的一般步骤:

1. 安装Pyinstaller

可以使用pip命令来安装Pyinstaller:`pip install pyinstaller`

2. 打包Python程序

打开终端或命令提示符,并导航到要打包的Python程序所在的目录。然后运行以下命令:`pyinstaller yourscript.py`

`yourscript.py`是您想要打包的Python脚本的文件名。在这个命令运行后,Pyinstaller将在同级目录下生成一个`dist`文件夹,其中包含使用Pyinstaller生成的可执行文件。

3. 运行可执行文件

找到上一步中生成的可执行文件,并双击它就可以运行您的Python程序了。

注意:有些Python程序可能需要额外的依赖项才能正常运行。如果您的程序有这些依赖项,请在运行上述命令之前安装它们,并使用下列命令打包程序:`pyinstaller --hidden-import=name_of_dependency yourscript.py` 。

对于这个代码,额外的依赖项包括:

  1. PyQt5库
  2. datetime库
  3. sys模块

如果您使用的是标准的Python发行版(例如Anaconda),则PyQt5和datetime库一般都已经预安装过了。如果您的Python环境中没有这些库,您可以通过pip命令来安装它们:pip install PyQt5 datetime

另外,sys模块是Python自带的,您无需额外安装。

在打包程序时,使用Pyinstaller的--hidden-import参数指定程序所依赖的PyQt5模块:pyinstaller --hidden-import PyQt5 yourscript.py。根据需要,也可以使用相同的方式指定其他依赖库。

最后执行命令:

pyinstaller -w -F age_calculator.py

        其中,-w参数可以使得程序运行时不弹出命令行窗口,-F参数可以将程序打包为单独一个可执行文件。打包完成后,你可以将生成的可执行文件拷贝到其他Windows 10计算机中运行。

代码:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import sys
import datetime
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton


class AgeCalculator(QWidget):

    def __init__(self):
        super().__init__()
        self.__init_UI()

    def __init_UI(self):
        self.age_label = QLabel('请输入出生日期(例如:1990-01-01):')
        self.age_edit = QLineEdit()
        self.result_label = QLabel('你的年龄是:')
        self.result_edit = QLineEdit()
        self.result_edit.setReadOnly(True)

        self.calculate_button = QPushButton('计算', self)
        self.calculate_button.clicked.connect(self.calculate_age)

        vbox = QVBoxLayout()
        hbox1 = QHBoxLayout()
        hbox1.addWidget(self.age_label)
        hbox1.addWidget(self.age_edit)
        vbox.addLayout(hbox1)
        hbox2 = QHBoxLayout()
        hbox2.addWidget(self.result_label)
        hbox2.addWidget(self.result_edit)
        vbox.addLayout(hbox2)
        vbox.addWidget(self.calculate_button)
        self.setLayout(vbox)

        self.setGeometry(100, 100, 400, 150)
        self.setWindowTitle('年龄计算器')
        self.show()

    def calculate_age(self):
        birth = self.age_edit.text()
        print(repr(birth))
        if birth:
            try:
                # 将生日字符串转成 datetime 对象
                birth_date = datetime.datetime.strptime(birth, '%Y-%m-%d').date()
                # 计算今天的日期
                today = datetime.date.today()
                # 计算年龄
                age_ = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))
                self.result_edit.setText('%d 岁' % age_)
            except Exception as e:
                self.result_edit.setText('请输入正确的日期格式(例如:1990-01-01)')
                raise Exception("Error: {0}".format(e))
        else:
            self.result_edit.setText('请输入出生日期(例如:1990-01-01)')


if __name__ == '__main__':
    app = QApplication(sys.argv)
    calculator = AgeCalculator()
    sys.exit(app.exec_())

以下是代码逐行的解释:

001

导入所需的 PyQT5 组件、datetime和 sys 模块。

002

定义一个用于计算年龄的 AgeCalculator 类,并在构造函数中初始化界面 __init_UI() 函数。然后设置标签和文本框 QLabel 和 QLineEdit 用于输入和显示信息,创建一个 QVBox 布局,并将两个 QHBoxLayout 布局放在主布局中以使界面看起来更合理。创建一个 QPushButton 按钮,并连接到 clicked 信号,用于触发计算年龄的 calculate_age 函数。最后,设置窗口大小和标题,并显示此窗口 self.show()

003

定义了一个计算年龄的方法。

004

根据 PyQT5 的标准写法,使用 if __name__ == '__main__': 来表示此代码段是以脚本运行,而不是从其他脚本中导入。创建一个 Qt 应用程序对象并实例化 AgeCalculator 类,并调用 app.exec_() 启动应用程序主循环。

逐行解析:
1. `import sys`: 引入 Python 标准库中的 sys 模块,它包含了与 Python 解释器和当前环境相关的函数。

2. `import datetime`: 引入 Python 标准库中的 datetime 模块,它包含了处理日期和时间的函数和类。

3. `from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QVBoxLayout, QHBoxLayout, QPushButton`: 引入 PyQt5.QtWidgets 中包含的常用组件类,它们用于创建图形用户界面。

4. `class AgeCalculator(QWidget):`:定义一个新的类 AgeCalculator,它是从 QWidget 类继承而来的,表示我们要创建的 GUI 窗口。

5. `def __init__(self):`:定义一个构造函数(初始化函数),用于初始化窗口。

6. `super().__init__()`:调用父类 QWidget 的构造函数,用于初始化 QWidget 类的属性。

7. `self.__init_UI()`:调用当前类的私有方法 __init_UI()。

8. `def __init_UI(self):`:定义一个私有的方法 __init_UI(),用于创建 GUI 窗口上的组件和布局。

9. `self.age_label = QLabel('请输入出生日期(例如:1990-01-01):')`: 创建一个 QLabel 组件,用于提示用户输入出生日期。

10. `self.age_edit = QLineEdit()`: 创建一个 QLineEdit 组件,用于接收用户输入的出生日期。

11. `self.result_label = QLabel('你的年龄是:')`: 创建一个 QLabel 组件,用于显示计算结果的标签。

12. `self.result_edit = QLineEdit()`: 创建一个 QLineEdit 组件,用于显示计算结果。

13. `self.result_edit.setReadOnly(True)`: 将 QLineEdit 组件设置为只读,禁止用户编辑。

14. `self.calculate_button = QPushButton('计算', self)`: 创建一个 QPushButton 组件,用于触发计算年龄的操作。

15. `self.calculate_button.clicked.connect(self.calculate_age)`: 绑定按钮的 clicked 事件到计算年龄的方法 calculate_age() 上。

16. `vbox = QVBoxLayout()`: 创建一个垂直布局管理器,用于将组件按照垂直方向排列。

17. `hbox1 = QHBoxLayout()`: 创建一个水平布局管理器,用于将出生日期输入组件水平排列。

18. `hbox1.addWidget(self.age_label)`: 将出生日期提示标签添加到水平布局管理器中。

19. `hbox1.addWidget(self.age_edit)`: 将出生日期输入框添加到水平布局管理器中。

20. `vbox.addLayout(hbox1)`: 将水平布局管理器添加到垂直布局管理器中。

21. `hbox2 = QHBoxLayout()`: 创建一个水平布局管理器,用于将计算结果组件水平排列。

22. `hbox2.addWidget(self.result_label)`: 将计算结果提示标签添加到水平布局管理器中。

23. `hbox2.addWidget(self.result_edit)`: 将计算结果输入框添加到水平布局管理器中。

24. `vbox.addLayout(hbox2)`: 将水平布局管理器添加到垂直布局管理器中。

25. `vbox.addWidget(self.calculate_button)`: 将计算年龄按钮添加到垂直布局管理器中。

26. `self.setLayout(vbox)`: 将整个垂直布局管理器设置为窗口的布局。

27. `self.setGeometry(100, 100, 400, 150)`: 设置窗口的位置和大小。

28. `self.setWindowTitle('年龄计算器')`: 设置窗口的标题。

29. `self.show()`: 显示窗口。

30. `def calculate_age(self):`:定义一个计算年龄的方法。

31. `birth = self.age_edit.text()`: 读取出生日期输入框中的文本内容。

32. `print(repr(birth))`: 输出出生日期字符串的表示形式,主要用于调试。

33. `if birth:`: 判断出生日期输入框中是否有文本内容。

34. `try:`: 尝试执行下面的语句,如果有异常则执行 except 语句块中的内容。

35. `birth_date = datetime.datetime.strptime(birth, '%Y-%m-%d').date()`: 将出生日期字符串转换为 datetime.date 类型的对象。

36. `today = datetime.date.today()`: 获取当前日期。

37. `age_ = today.year - birth_date.year - ((today.month, today.day) < (birth_date.month, birth_date.day))`: 计算年龄,包括当前已经过去的年份和未满一整年的天数。

38. `self.result_edit.setText('%d 岁' % age_)`: 将计算的年龄结果显示在 QLineEdit 组件中。

39. `except Exception as e:`: 捕获所有异常,并将异常信息保存在变量 e 中。

40. `self.result_edit.setText('请输入正确的日期格式(例如:1990-01-01)')`: 将提示信息显示在 QLineEdit 组件中。

41.  `raise Exception("Error: {0}".format(e))`: 抛出异常并显示异常信息。

42. `else:`: 当出生日期输入框为空时执行这个分支。

43. `self.result_edit.setText('请输入出生日期(例如:1990-01-01)')`: 将提示信息显示在 QLineEdit 组件中。

44. `if __name__ == '__main__':`: 如果该模块被直接运行,则执行下面的语句。

45. `app = QApplication(sys.argv)`: 创建一个 QApplication 应用程序对象,sys.argv 是命令行参数的列表。

46. `calculator = AgeCalculator()`: 创建一个 AgeCalculator 对象。

47. `sys.exit(app.exec_())`: 运行应用程序,并将返回值传递给 sys.exit() 函数,以正常退出程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值