鱼C论坛

 找回密码
 立即注册
查看: 2517|回复: 12

[已解决]输入身份证号码判断合法性,若为合法号码,则进一步判断性别

[复制链接]
发表于 2020-2-23 18:01:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 jiangyifei 于 2020-2-23 18:01 编辑

麻烦看一下下面代码哪里出问题了?
题目是这样的:
将前面的身份证号码17位数分别乘以不同的系数。从第一位到第十七位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2将这17位数字和系数相乘的结果相加。用加出来和除以11,看余数是多少?余数只可能有0 1 2 3 4 5 6 7 8 9 10这11个数字。其分别对应的最后一位身份证的号码为1 0 X 9 8 7 6 5 4 3 2。通过上面得知如果余数是2,就会在身份证的第18位数字上出现罗马数字的Ⅹ。如果余数是10,身份证的最后一位号码就是2。

from tkinter import*
factor=(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
last=('1','0','X','9','8','7','6','5','4','3','2')
def func():
    id=ipt.get()
    if len(id)!=18:
        lb.config(text='输入非18位,请重新输入')
        ipt.delete(0,END)
    else:
        sum=0
        for i in range(17):
            sum+=int(id)*factor
            m=sum%11
            lastchar=id[-1]
            lastchar=lastchar.upper()
            if lastchar==last[m]:
                s='为合法身份证号码,\n'
                s+=('出生日期为:%s年%s月%s日,\n'%(id[6:10],id[10:12],id[12:14]))
                if int(id[-2])%2==0:
                    s+='性别:女'
                else:
                    s+='性别:男'
root=Tk()
root.title('身份证号码')
root.geometry('320x240')
lb=Label(root,text='result')
lb.place(relx=0.2,rely=0.4,relwidth=0.15,relheight=0.1)
lb.config(text=s)
ipt=Entry(root)
ipt.place(relx=0.1,rely=0.1,relwidth=0.8,relheight=0.08)
bt=Button(root,text='校验',command=func)
bt.place(relx=0.8,rely=0.3,relwidth=0.1,relheight=0.08)

root.mainloop()

Traceback (most recent call last):
  File "D:/python/第8章/3.身份证.py", line 28, in <module>
    lb.config(text=s)?不是定义过吗?
NameError: name 's' is not defined
>>>
然后我把  lb.config(text=s) 改为   lb.config(text=‘s’)后,点击按钮就没有反应了,请问是怎么回事?
最佳答案
2020-2-24 12:20:49
jiangyifei 发表于 2020-2-24 11:40
if lastchar==last[m]:
               global s
                s=''

额,不是
在导入模块的后面
  1. from tkinter import*
  2. s = ""
  3. factor=(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
  4. last=('1','0','X','9','8','7','6','5','4','3','2')
  5. #剩下的代码
  6. #global s不用变位置
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-23 18:03:13 | 显示全部楼层
因为这样做的话,text就永远是's'这个字符了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 18:09:32 | 显示全部楼层
qiuyouzhi 发表于 2020-2-23 18:03
因为这样做的话,text就永远是's'这个字符了

但如果不这样做,就会显示 NameError: name 's' is not defined,但s已经在中间定义过了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 18:12:00 | 显示全部楼层
jiangyifei 发表于 2020-2-23 18:09
但如果不这样做,就会显示 NameError: name 's' is not defined,但s已经在中间定义过了

加一行global s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 20:06:09 | 显示全部楼层

在 def func():下面加吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-23 20:21:20 | 显示全部楼层
jiangyifei 发表于 2020-2-23 20:06
在 def func():下面加吗?

在定义s的后边
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-23 20:42:08 | 显示全部楼层

if lastchar==last[m]:
               global s
                s='为合法身份证号码,\n'
                s+=('出生日期为:%s年%s月%s日,\n'%(id[6:10],id[10:12],id[12:14]))
是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 07:52:58 | 显示全部楼层
jiangyifei 发表于 2020-2-23 20:42
if lastchar==last[m]:
               global s
                s='为合法身份证号码,\n'

嗯,但要先初始化s为一个空字符串
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 11:40:07 | 显示全部楼层
qiuyouzhi 发表于 2020-2-24 07:52
嗯,但要先初始化s为一个空字符串

if lastchar==last[m]:
               global s
                s=''
                s='为合法身份证号码,\n'
是这样吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 12:20:49 | 显示全部楼层    本楼为最佳答案   
jiangyifei 发表于 2020-2-24 11:40
if lastchar==last[m]:
               global s
                s=''

额,不是
在导入模块的后面
  1. from tkinter import*
  2. s = ""
  3. factor=(7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2)
  4. last=('1','0','X','9','8','7','6','5','4','3','2')
  5. #剩下的代码
  6. #global s不用变位置
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 14:07:20 | 显示全部楼层
qiuyouzhi 发表于 2020-2-24 12:20
额,不是
在导入模块的后面

这样做之后,不会出现刚才问题,但按了之后没有反应
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-24 15:20:37 | 显示全部楼层
jiangyifei 发表于 2020-2-24 14:07
这样做之后,不会出现刚才问题,但按了之后没有反应

给你改了一下
是必须要在窗口里输出结果是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-24 16:32:05 | 显示全部楼层
本帖最后由 jiangyifei 于 2020-2-24 16:35 编辑
qiuyouzhi 发表于 2020-2-24 15:20
给你改了一下
是必须要在窗口里输出结果是吗?


    if lastchar==last[m]:
                global s
                s='为合法身份证号码,\n'
                s+=('出生日期为:%s年%s月%s日,\n'%(id[6:10],id[10:12],id[12:14]))
                if int(id[-2])%2==0:
                    s+='性别:女'
                else:
                    s+='性别:男'
是的,就是输出字符串s
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-29 05:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表