最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+PyQt編寫一個批量年齡計算工具

 更新時間:2025年10月09日 09:48:31   作者:Goona_  
在日常工作中,批量計算人員年齡是一項常見但繁瑣的任務(wù),這篇文章主要為大家介紹一下如何結(jié)合Python和PyQt編寫一個年齡計算工具,感興趣的小伙伴可以了解下

一、引言

在日常工作中,批量計算人員年齡是一項常見但繁瑣的任務(wù),傳統(tǒng)的手工處理方式不僅效率低下,還容易因人為操作導致錯誤。為此,我們開發(fā)了基于PyQt框架的批量年齡(周歲)計算工具,該工具能夠從18位身份證號中自動提取出生日期(第7-14位為YYYYMMDD格式),并結(jié)合用戶指定的目標日期,高效、精準地計算出周歲年齡。同時支持將結(jié)果直接復制導出,便于后續(xù)數(shù)據(jù)分析與系統(tǒng)集成。

二、GUI界面設(shè)計

使用PyQt5進行界面的搭建,界面如下:

初始界面搭建采用極簡風格。當批量輸入(也可直接從excel中復制粘貼)合法的身份證號碼后,若其合法,點擊“計算”后會在右側(cè)給出對應年齡(周歲)結(jié)果;否則,會告知用戶輸入身份證號碼存在不合法項并提示重新輸入。

需要注意的是:該計算工具會結(jié)合用戶指定的目標日期,高效、精準地計算出周歲年齡。如上圖紅框所示:當兩者均為2000年出生,得到的年齡相差為1,原因在于前者是4月份出生(到2025年的10月7日滿周歲),后者是11月份出生(到2025年的10月7日未滿周歲)

1.相關(guān)提示

在未輸入身份證和未選擇指定日期,進行“計算”操作后,均會給出提示;當用戶輸入的身份證存在長度錯誤或特殊字符時,提示“輸入身份證有誤,請重新輸入”。

2.效果演示

3.界面設(shè)計.py

通過pyuic5產(chǎn)生的GUI界面代碼jiemian.py如下:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'jiemian.ui'
#
# Created by: PyQt5 UI code generator 5.15.11
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setEnabled(True)
        Form.resize(360, 450)
        Form.setMinimumSize(QtCore.QSize(360, 450))
        Form.setMaximumSize(QtCore.QSize(360, 450))
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
        Form.setWindowIcon(icon)
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setGeometry(QtCore.QRect(210, 40, 141, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(16)
        self.label_5.setFont(font)
        self.label_5.setObjectName("label_5")
        self.label_8 = QtWidgets.QLabel(Form)
        self.label_8.setGeometry(QtCore.QRect(130, 10, 251, 31))
        font = QtGui.QFont()
        font.setFamily("Adobe Arabic")
        font.setPointSize(18)
        font.setBold(False)
        font.setWeight(50)
        self.label_8.setFont(font)
        self.label_8.setObjectName("label_8")
        self.label_10 = QtWidgets.QLabel(Form)
        self.label_10.setGeometry(QtCore.QRect(290, 30, 71, 51))
        self.label_10.setText("")
        self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
        self.label_10.setObjectName("label_10")
        self.textEdit = QtWidgets.QTextEdit(Form)
        self.textEdit.setGeometry(QtCore.QRect(30, 110, 141, 201))
        self.textEdit.setObjectName("textEdit")
        self.textEdit_2 = QtWidgets.QTextEdit(Form)
        self.textEdit_2.setGeometry(QtCore.QRect(200, 110, 141, 201))
        self.textEdit_2.setObjectName("textEdit_2")
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(30, 85, 121, 21))
        self.label.setObjectName("label")
        self.label_2 = QtWidgets.QLabel(Form)
        self.label_2.setGeometry(QtCore.QRect(200, 90, 54, 12))
        self.label_2.setObjectName("label_2")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(30, 410, 311, 23))
        self.pushButton.setObjectName("pushButton")
        self.comboBox = QtWidgets.QComboBox(Form)
        self.comboBox.setGeometry(QtCore.QRect(40, 360, 67, 22))
        self.comboBox.setObjectName("comboBox")
        self.comboBox_2 = QtWidgets.QComboBox(Form)
        self.comboBox_2.setGeometry(QtCore.QRect(150, 360, 67, 22))
        self.comboBox_2.setObjectName("comboBox_2")
        self.comboBox_3 = QtWidgets.QComboBox(Form)
        self.comboBox_3.setGeometry(QtCore.QRect(260, 360, 67, 22))
        self.comboBox_3.setObjectName("comboBox_3")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setGeometry(QtCore.QRect(110, 360, 16, 21))
        self.label_3.setObjectName("label_3")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setGeometry(QtCore.QRect(220, 360, 21, 21))
        self.label_4.setObjectName("label_4")
        self.label_6 = QtWidgets.QLabel(Form)
        self.label_6.setGeometry(QtCore.QRect(330, 360, 21, 21))
        self.label_6.setObjectName("label_6")
        self.label_7 = QtWidgets.QLabel(Form)
        self.label_7.setGeometry(QtCore.QRect(30, 330, 121, 31))
        self.label_7.setObjectName("label_7")

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Age_cal"))
        self.label_5.setText(_translate("Form", "Designed By"))
        self.label_8.setText(_translate("Form", "年齡計算"))
        self.label.setText(_translate("Form", "請輸入身份證號碼:"))
        self.label_2.setText(_translate("Form", "年齡如下:"))
        self.pushButton.setText(_translate("Form", "計算"))
        self.label_3.setText(_translate("Form", "年"))
        self.label_4.setText(_translate("Form", "月"))
        self.label_6.setText(_translate("Form", "日"))
        self.label_7.setText(_translate("Form", "請選擇指定日期:"))
import ziyuan_rc

三、主要程序詳解

1.導入相關(guān)模塊

import sys, time
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

導入前端頁面設(shè)計文件:jiemian.py;不懂為啥需要導入Qtcore的,請看一鍵曝光:Python+PyQt實現(xiàn)的文件目錄。

2.初始化設(shè)置

    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.jisuan)
        self.comboBox.currentIndexChanged.connect(self.day_show)  # 年份選項發(fā)生改變
        self.comboBox_2.currentIndexChanged.connect(self.day_show)  # 月份選項發(fā)生改變

        self.comboBox.addItem('請選擇')
        self.comboBox_2.addItem('請選擇')

        # 針對“年”
        self.cur_nian = time.strftime("%Y", time.localtime())
        # 使用列表推導式增添選項
        self.comboBox.addItems([str(int(self.cur_nian) + i) for i in range(-5, 6)])  # 年
        self.comboBox_2.addItems([str(i) for i in range(1, 13)])  # 月

pushbutton綁定于jisuan;當用戶改變年度/月份時,對應的“日”也需要緊隨變化,故將其綁定于day_show;同時在初始化時將年份comboBox和月份comboBox_2添加首選項“請選擇”,日comboBox暫時不做處理;接著通過time.strftime獲取當前年份并存儲于cur_nian中;以當前年份為時間中點,使用列表推導式往前往后各推5年添加至comboBox中;最后再通過列表推導式添加12個月份。

3.“日”選項的設(shè)置

    def day_show(self):
    """主要對日進行設(shè)置,因為其不僅與月份有關(guān),還與年份有關(guān)(閏年的2月)"""
        self.comboBox_3.clear()
        self.comboBox_3.addItem('請選擇')
        yue_text = self.comboBox_2.currentText()  # 判斷用戶選擇的是哪個月
        if yue_text in ['1', '3', '5', '7', '8', '10', '12']:  # 31天的月份
            self.comboBox_3.addItems([str(i) for i in range(1, 32)])
        elif yue_text in ['4', '6', '9', '11']:  # 30天的月份
            self.comboBox_3.addItems(str(i) for i in range(1, 31))
        elif yue_text == '2':  # 針對2月要特殊處理
            if self.comboBox.currentIndex() != 0:  # 除去年份為“請選擇”的特殊情況
                if year_judge(self.comboBox.currentText()):  # 為閏年,2月為29天
                    self.comboBox_3.addItems([str(i) for i in range(1, 30)])
                else:  # 不為閏年,2月為28天
                    self.comboBox_3.addItems([str(i) for i in range(1, 29)])
        else:  # 表示月份的“請選擇”選項
            pass

與其他combobox一樣,combobox_3“日下拉框”也需要clear()和添加首選項“請選擇”;combobox_3其不僅取決于“年下拉框”combobox是否為閏年,而且還取決于“月下拉框”combobox_2的選擇(有31天的月份,也有30天的月份);所以先判斷combobox_2的text是否在31天和30天的月份中,如果存在,直接使用列表推導式additems即可;否則如果為2月,還需通過自定義函數(shù)year_judge判斷當前年份是否為閏年;如果為閏年,則列表推導式產(chǎn)生29天,否則產(chǎn)生28天;此時,combobox_3未討論情況只剩下“請選擇”選項,pass即可。

4.年齡(周歲)的計算

    def jisuan(self):
        shuru = self.textEdit.toPlainText()  # 讀取的默認類型為str

        if shuru != "": # 用戶輸入不為空時
            if (self.comboBox.currentIndex()!=0) and(self.comboBox_2.currentIndex()!=0) and (self.comboBox_3.currentIndex()!=0): # 用戶做出年月日的選擇
                shuru_nian = self.comboBox.currentText()
                shuru_yue = self.comboBox_2.currentText()
                shuru_ri = self.comboBox_3.currentText()
                zhiding_riqi = riqi_return(shuru_nian,shuru_yue,shuru_ri) # 合并為YYYYMMDD的形式

                shuru_list = shuru.split()  # 以換行符分割
                riqi = [i[6:14] for i in shuru_list] # 截取所有身份證的8位日期

                jieguo  =[] # 年齡差存放
                for i in riqi:
                    if (len(i) == 8) and i.isdigit(): # 長度為8且均為數(shù)字
                        jieguo.append(niancha_cal(zhiding_riqi, i))
                    else:
                        QtWidgets.QMessageBox.critical(self, "提示", "輸入身份證有誤,請重新輸入!")
                        break

                self.textEdit_2.clear() # 清除上次結(jié)果
                for item in jieguo:
                    self.textEdit_2.append(str(item))
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "請選擇指定日期!")
        else:
            QtWidgets.QMessageBox.critical(self, "提示", "請輸入身份證號!")

當用戶輸入不為空時,判斷用戶是否進行了“年月日”的選擇(依據(jù)item的索引);若用戶已經(jīng)進行選擇,則讀取年月日并存儲,通過調(diào)用自定義函數(shù)riqi_return從而返回YYYYMMDD的日期規(guī)范格式;再通過對用戶輸入的所有身份證進行切片操作,獲取8位日期,并與上述YYYYMMDD通過自定義函數(shù)niancha_cal進行比較和計算,將得到的結(jié)果添加至jieguo中;最后通過循環(huán)顯示到textedit_2中。

5.自定義函數(shù)

def year_judge(year):
    """判斷用戶輸入是否為閏年"""
    if (int(year)%4==0) and (int(year)%100!=0):
        return True
    elif int(year)%400==0:
        return True
    else:
        return False

閏年的標志:能被4整除的同時,但不能被100整除;或者是能被400直接整除。

def riqi_return(nian, yue, ri):
    """將年月日三數(shù)字轉(zhuǎn)換合并為YYYYMMDD形式"""
    if (int(yue)<10): # 單月形式
        if (int(ri)<10): # 單日
            return nian+'0'+yue+'0'+ri # 補零操作
        else:
            return nian+'0'+yue+ri
    else:
        if (int(ri) < 10):
            return nian+yue+'0'+ri
        else:
            return nian+yue+ri

通過分支結(jié)構(gòu),在單數(shù)字前進行補零,最后將字符串拼接即可得到Y(jié)YYYMMDD形式。

def niancha_cal(date1, date2):
    # 默認date1先于date2
    if int(date1)<int(date2): # 交換兩者順序
        temp = date1
        date1 = date2
        date2 = temp

    if int(date1[4:6]) < int(date2[4:6]): # 判斷月的大小關(guān)系
        return int(date1[0:4])-int(date2[0:4])-1 # 不滿周歲得減一
    elif int(date1[4:6]) > int(date2[4:6]):
        return int(date1[0:4])-int(date2[0:4])
    else:
        if int(date1[6:8]) < int(date2[6:8]): # 進一步判斷“日”的大小關(guān)系
            return int(date1[0:4]) - int(date2[0:4]) - 1  # 不滿周歲得減一
        else:
            return int(date1[0:4]) - int(date2[0:4])

默認date1先于date2,否則進行交換;接下來截取月份和日進行比較,最終截取年份相減,根據(jù)是否滿周歲判斷是否多減一。

四、總程序代碼

import sys, time
from jiemian import *
from PyQt5.QtWidgets import QApplication, QWidget
# 保持窗口大小和qtdesigner中的一致
from PyQt5 import QtCore
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)

class window(QWidget, Ui_Form):
    def __init__(self):
        super(QWidget, self).__init__()
        self.setupUi(self)

        self.pushButton.clicked.connect(self.jisuan)
        self.comboBox.currentIndexChanged.connect(self.day_show)  # 年份選項發(fā)生改變
        self.comboBox_2.currentIndexChanged.connect(self.day_show)  # 月份選項發(fā)生改變

        self.comboBox.addItem('請選擇')
        self.comboBox_2.addItem('請選擇')

        # 針對“年”
        self.cur_nian = time.strftime("%Y", time.localtime())
        # 使用列表推導式增添選項
        self.comboBox.addItems([str(int(self.cur_nian) + i) for i in range(-5, 6)])  # 年
        self.comboBox_2.addItems([str(i) for i in range(1, 13)])  # 月

    def day_show(self):
        self.comboBox_3.clear()
        self.comboBox_3.addItem('請選擇')
        yue_text = self.comboBox_2.currentText()  # 判斷用戶選擇的是哪個月
        if yue_text in ['1', '3', '5', '7', '8', '10', '12']:  # 31天的月份
            self.comboBox_3.addItems([str(i) for i in range(1, 32)])
        elif yue_text in ['4', '6', '9', '11']:  # 30天的月份
            self.comboBox_3.addItems(str(i) for i in range(1, 31))
        elif yue_text == '2':  # 針對2月要特殊處理
            if self.comboBox.currentIndex() != 0:  # 除去年份為“請選擇”的特殊情況
                if year_judge(self.comboBox.currentText()):  # 為閏年,2月為29天
                    self.comboBox_3.addItems([str(i) for i in range(1, 30)])
                else:  # 不為閏年,2月為28天
                    self.comboBox_3.addItems([str(i) for i in range(1, 29)])
        else:  # 表示月份的“請選擇”選項
            pass

    def jisuan(self):
        shuru = self.textEdit.toPlainText()  # 讀取的默認類型為str

        if shuru != "": # 用戶輸入不為空時
            if (self.comboBox.currentIndex()!=0) and(self.comboBox_2.currentIndex()!=0) and (self.comboBox_3.currentIndex()!=0): # 用戶做出年月日的選擇
                shuru_nian = self.comboBox.currentText()
                shuru_yue = self.comboBox_2.currentText()
                shuru_ri = self.comboBox_3.currentText()
                zhiding_riqi = riqi_return(shuru_nian,shuru_yue,shuru_ri) # 合并為YYYYMMDD的形式

                shuru_list = shuru.split()  # 以換行符分割
                riqi = [i[6:14] for i in shuru_list] # 截取所有身份證的8位日期

                jieguo  =[] # 年齡差存放
                for i in riqi:
                    if (len(i) == 8) and i.isdigit(): # 長度為8且均為數(shù)字
                        jieguo.append(niancha_cal(zhiding_riqi, i))
                    else:
                        QtWidgets.QMessageBox.critical(self, "提示", "輸入身份證有誤,請重新輸入!")
                        break

                self.textEdit_2.clear() # 清除上次結(jié)果
                for item in jieguo:
                    self.textEdit_2.append(str(item))
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "請選擇指定日期!")
        else:
            QtWidgets.QMessageBox.critical(self, "提示", "請輸入身份證號!")

def year_judge(year):
    """判斷用戶輸入是否為閏年"""
    if (int(year)%4==0) and (int(year)%100!=0):
        return True
    elif int(year)%400==0:
        return True
    else:
        return False

def riqi_return(nian, yue, ri):
    """將年月日三數(shù)字轉(zhuǎn)換合并為YYYYMMDD形式"""
    if (int(yue)<10): # 單月形式
        if (int(ri)<10): # 單日
            return nian+'0'+yue+'0'+ri # 補零操作
        else:
            return nian+'0'+yue+ri
    else:
        if (int(ri) < 10):
            return nian+yue+'0'+ri
        else:
            return nian+yue+ri

def niancha_cal(date1, date2):
    # 默認date1先于date2
    if int(date1)<int(date2): # 交換兩者順序
        temp = date1
        date1 = date2
        date2 = temp

    if int(date1[4:6]) < int(date2[4:6]): # 判斷月的大小關(guān)系
        return int(date1[0:4])-int(date2[0:4])-1 # 不滿周歲得減一
    elif int(date1[4:6]) > int(date2[4:6]):
        return int(date1[0:4])-int(date2[0:4])
    else:
        if int(date1[6:8]) < int(date2[6:8]): # 進一步判斷“日”的大小關(guān)系
            return int(date1[0:4]) - int(date2[0:4]) - 1  # 不滿周歲得減一
        else:
            return int(date1[0:4]) - int(date2[0:4])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = window()
    w.show()
    sys.exit(app.exec_())

到此這篇關(guān)于Python+PyQt編寫一個批量年齡計算工具的文章就介紹到這了,更多相關(guān)Python計算年齡內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中xrange與yield的用法實例分析

    Python中xrange與yield的用法實例分析

    這篇文章主要介紹了Python中xrange與yield的用法,結(jié)合實例形式較為詳細的分析了range和xrange功能、使用方法與相關(guān)注意事項,需要的朋友可以參考下
    2017-12-12
  • python基礎(chǔ)字符串str詳解

    python基礎(chǔ)字符串str詳解

    大家好,本篇文章主要講的是python基礎(chǔ)字符串str詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • python如何爬取網(wǎng)頁中的文字

    python如何爬取網(wǎng)頁中的文字

    在本篇文章里小編給大家整理的是關(guān)于python如何爬取網(wǎng)頁中的文字的相關(guān)實例內(nèi)容,需要的朋友們可以學習下。
    2020-07-07
  • Python docx庫刪除復制paragraph及行高設(shè)置圖片插入示例

    Python docx庫刪除復制paragraph及行高設(shè)置圖片插入示例

    這篇文章主要為大家介紹了Python docx庫刪除復制paragraph及行高設(shè)置圖片插入操作實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Python+PyQt5實現(xiàn)自制pdf工具箱

    Python+PyQt5實現(xiàn)自制pdf工具箱

    這篇文章主要為大家詳細介紹了Python如何利用PyQt5自制pdf工具箱,可以實現(xiàn)合并拆分和刪除指定pdf頁面,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-12-12
  • python列表:開始、結(jié)束、步長值實例

    python列表:開始、結(jié)束、步長值實例

    這篇文章主要介紹了python列表:開始、結(jié)束、步長值實例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • PyCharm中配置模板用法詳解

    PyCharm中配置模板用法詳解

    在PyCharm中配置模板,可以在創(chuàng)建新文件時自動生成固定的文件說明信息,配置方法包括打開PyCharm設(shè)置、編輯文件和代碼模板、選擇PythonScript并輸入模板命令等步驟,參數(shù)定制化也方便了個性化需求
    2026-04-04
  • Python數(shù)據(jù)類型詳解(二)列表

    Python數(shù)據(jù)類型詳解(二)列表

    本文給大家詳細介紹的是Python數(shù)據(jù)類型中的列表(list),非常的簡單實用,有需要的小伙伴可以參考下
    2016-05-05
  • 使用Qt?QSS繪制簡單美化界面功能

    使用Qt?QSS繪制簡單美化界面功能

    這篇文章主要介紹了使用Qt?QSS繪制簡單美化界面,本文以繪制登錄界面為例,創(chuàng)建一個繼承自Qwidget的設(shè)計師界面類,為了使得控件排放整齊有序,可以使用layout布局進行輔助,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • pytorch 固定部分參數(shù)訓練的方法

    pytorch 固定部分參數(shù)訓練的方法

    今天小編就為大家分享一篇pytorch 固定部分參數(shù)訓練的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08

最新評論

民勤县| 青铜峡市| 凯里市| 乡城县| 颍上县| 图们市| 冀州市| 科技| 和硕县| 丰宁| 达州市| 怀远县| 石嘴山市| 密山市| 白玉县| 衡阳县| 南开区| 灵川县| 安西县| 杭锦后旗| 潮安县| 杂多县| 松原市| 论坛| 垣曲县| 沁源县| 抚顺县| 同江市| 西乌| 中山市| 临漳县| 吉隆县| 庆阳市| 饶阳县| 南召县| 石嘴山市| 安多县| 吕梁市| 商城县| 丹寨县| 吴旗县|