python公园售票小程序(身份证获取简单信息+简单数据分析+简单多线程)

1.文件目录

 2.main.py主文件

from utils import welcome,examineIdCard,playMusic,dataAnalysis
import _thread
theFirstTime = 1
while True:
    _thread.start_new_thread(playMusic)  #开启多线程播放音乐
    if theFirstTime == 1:  #初次游玩(没有信息所以不展示数据分析功能)
        choose = int(input("请选择(1.进入 2.出去) :"))
    else:
        choose = int(input("请选择(1.进入 2.出去 3.数据分析) :"))
    if choose == 1:
        theFirstTime += 1
        welcome()
        examineIdCard()
    elif choose == 2:
        break  #退出
    else:
        dataAnalysis()  #进入数据分析

 3.utils.py

简单说一下各个方法的功能:

welcome():输出一些信息

examineIdCard():对输入的身份证号(位数)进行判断、使用身份证校验位对身份证号进行有效校验

judgeMessage():对身份证信息省市区(目前只有山东省各市信息)、性别简单计算、年龄复杂计算(对我而言比较复杂~)

printMessage():将身份证获取到的信息保存在目录下的Identity Information.xlsx文件夹

playMusic():多线程播放音乐

body_height():输出信息、获取终端输入的身高信息

buyTicket():根据年龄和身高判断票的具体类型

dataAnalysis():读取Identity Information.xlsx文件里的内容,进行简单数据分析。

(时间紧迫,我就只对年龄和身高进行了饼图绘制)

import numpy as np
import pandas as pd

def welcome():
    #欢迎语
    print("*************************欢~迎~游玩-->!青科大公园!*************************")
    print("----------------------------------------------------------------------------")
    print("|                                  购票须知                                     |")
    print("|(1)2岁以下(包含2岁)儿童免票。                                                  |")
    print("|(2)2岁以上到16岁未成年人,未到1.2m的购买半票,超过1.2米(包含1.2米)的购全票。 |")
    print("|(3)16岁(不含16岁)到60岁(不含60岁)的成人购全票。                            |")
    print("|(4)60岁及以上长者,凭退休证购买半票。                                          |")
    print("----------------------------------------------------------------------------")

def examineIdCard():
    idCard = input("(售票老大爷)嗨!年轻人,公园售票口在这儿,快过来吧,把你的身份证(号码)给我:")
    #对身份证输入号码位数进行有效识别
    if len(idCard) != 18:
        print("您输入的身份证号位数错误,请重新输入!")
    else:
        #(准备)全部转化为列表容易操作
        idCard = list(idCard)
        WEIGHTS = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]  #设置加权因子列表
        sum = 0  #求和
        for i in range(len(WEIGHTS)):
            sum += int(idCard[i])*WEIGHTS[i]
        remainder = sum % 11  #计算余数
        REMAINDER_CHECKCODE = [1,0,'X',9,8,7,6,5,4,3,2]  #设置余数-校验码对照表,采用列表形式
        if REMAINDER_CHECKCODE[remainder] == int(idCard[17]):
            print("(售票老大爷)oh~上帝啊  瞧一瞧,这个消息真让人开心,你的身份被上帝认可了~~")
            print("(售票老大爷)接下来请开始购票吧!")
        else:
            print("------------>身份证无效")
        #保存一些信息:前六位是地区代码,7~14位是出生年月,15、16为派出所代码,17位是性别
        sheng = "".join(idCard[0:2])#出生地
        shi = "".join(idCard[2:4])
        quxian = "".join(idCard[4:6])
        dateOfBirth = "".join(idCard[6:14])  #出生年月
        policeStation = "".join(idCard[14:16])  #派出所代码
        gender = "".join(idCard[16])  #性别
        sheng,shi,gender,age,nianBirth,yueBirth,riBirth = judgeMessage(idCard,sheng,shi,gender,dateOfBirth)  #判断信息方法
        height = body_height()  #输入身高信息函数
        # printMessage(idCard,sheng,shi,quxian,policeStation,gender,age,nianBirth,yueBirth,riBirth,height)  ##打印信息方法
        printMessage(idCard,sheng,shi,quxian,dateOfBirth,policeStation,age,gender,height)
        buyTicket(age,height)  #买票方法

def judgeMessage(idCard,sheng,shi,gender,dateOfBirth):
    #信息判断
    if sheng == "37":
        sheng = "山东省"
        SHI = ['0','济南市','青岛市','淄博市','枣庄市','东营市','烟台市','潍坊市','济宁市','泰安市','威海市','日照市','','临沂市','德州市','聊城市','滨州市','菏泽市']
        shi = SHI[int(shi)]
    if gender == "1":
        gender = "男"
    else:
        gender="女"
    #处理年龄(粗略的计算年龄)
    # 计算机获取当前年月日 与 身份证上的年月日 进行做差比较
    import datetime
    nowDate = datetime.datetime.now().strftime('%Y%m%d')
    nianNowDate = nowDate[0:4]  #20211223
    yueNowDate = nowDate[4:6]
    riNowDate = nowDate[6:8]
    idCard = "".join(idCard)
    nianBirth = idCard[6:10]  #身份证上的年月日
    yueBirth = idCard[11:12]
    riBirth = idCard[12:14]
    if int(yueNowDate+riNowDate) < int(yueBirth+riBirth):
        #目前月日小于出生月日,说明今年生日还没有过
        age = int(nianNowDate)-int(nianBirth)
    else:
        #目前月日大于等于出生月日,说明今年生日已过,年龄还要再加1
        age = int(nianNowDate)-int(nianBirth)+1
    return sheng,shi,gender,age,nianBirth,yueBirth,riBirth


def printMessage(idCard,sheng,shi,quxian,dateOfBirth,policeStation,age,gender,height):
    idCard = "".join(idCard)
    df = pd.read_excel('Identity Information.xlsx')
    #获取信息
    if gender == "男":
        idCard = "Adam"
    else:
        idCard = "Eve"
    sheng = sheng
    shi = shi
    quxian = quxian
    chushengdi = sheng+shi+quxian
    dateOfBirth = dateOfBirth
    policeStation = policeStation
    age = age
    gender = gender
    height = height
    #添加到表格中
    #1.获取当前表格的空行
    havehang_index = df.shape[0]
    df.loc[havehang_index] = [idCard,chushengdi,dateOfBirth,policeStation,age,gender,height]
    #重新保存
    df.to_excel("Identity Information.xlsx",encoding='utf-8',index=False)

import winsound
def playMusic():
    winsound.PlaySound("music/雪之梦重混版.wav",winsound.SND_FILENAME)


def body_height():
    print("(售票老大爷)oh~上帝啊 瞧我的记性(公园售票处记忆力不好的老大爷),来!购票前上帝还需要你的一些信息")
    print("(售票老大爷)嗨!快过来! 你要到那里去儿")
    print("(售票老大爷)oh~上帝啊 快!告诉我你的身高吧,这样你就能够快点儿进去公园去和动物们打招呼了!")
    height = input("(售票老大爷)快点写上你的身高吧:")
    return height

def buyTicket(age,height):
    if age<=2:
        #免票
        print("(售票老大爷)你才刚"+str(age)+"岁!免票")
        print("(售票老大爷)ohohoh~上帝真是眷顾你,我的孩子!快去玩儿吧")
    elif age>2 and age<=16:
        if height<120:
            print("(售票老大爷)你"+str(age)+"岁了,购买半票!")
            print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
        else:
            print("(售票老大爷)你"+str(age)+"岁了,购买全票!")
            print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
    elif age>16 and age<60:
        print("(售票老大爷)你"+str(age)+"了,已经成人喽!购买全票")
        print("(售票老大爷)ohohoh~上帝真是眷顾你,你的票由程序开发人员帮你购买了!快去玩儿吧")
    elif age>=60:
        get_txz = input("(售票老大爷)您带退休证了吗?(回答yes或者no!):")
        if get_txz == "yes":
            print("(售票老大爷)您购买半票!")
        if get_txz == "no":
            print("(售票老大爷)您购买全票!下次再来请记得带好您的退休证。")

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def dataAnalysis():
    #简单数据分析(年龄、性别、身高),画个饼图
    #1.读取数据
    df = pd.read_excel('Identity Information.xlsx')
    #获取需要进行画图的列信息
    labels = list(df['姓名'])
    age = list(df['年龄'])
    gender = list(df['性别'])
    height = list(df['身高'])
    choice = input("请选择需要看的图:1(年龄比例饼图)、2(身高比例饼图)。请输入:")
    if choice == "1":
        #age
        plt.pie(x=age,labels=labels,autopct="%0.2f%%")
        plt.title("Age scale")
    else:
        #height
        plt.pie(x=height,labels=labels,autopct="%0.2f%%")
        plt.title("Height scale")
    # 显示图例
    plt.legend()
    # 展示
    plt.show()

4.使用方法。

(1)下载安装包,选择“解压到当前文件夹”

 (2)使用vscode打开(使用你自己的python编辑器),进入main,py执行就可以了。

开始运行后,自动播放音乐(班得瑞的雪之梦重混版),会让你选择“进入”还是“退出”:

 选择“进入”,弹出欢迎信息,然后输入你的身份证号:

(我就不输完了,保护隐私)

 然后再出现一些交谈信息,提示你输入身高:

 输入完身高后,会自动根据身份证获得的年龄结合身高,输出你的购票信息(这里往后我就没有再深入写了)我继续写数据分析去了

 如上图,选择3进行数据分析

 再继续选择图的种类(也是由于时间紧迫,我只做了两种图  年龄比例图和身高比例图),后续可以再往下写(我就此为止了!)

选择2,就得到图形了

源码百度云连接(没有VIP可能会比较慢):

链接:https://pan.baidu.com/s/1X2WaQ8Pmz8PouypTRJpS5w 
提取码:rp9k 

也可以加我的QQ:827843900 获取资料

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值