8
社区成员




源代码传奇开心果IDE运行和调试通过
import wx
import wx.lib.agw.aui as aui
import datetime
import re
# 地区码字典
area_codes = {
'11': '北京市', '12': '天津市', '13': '河北省', '14': '山西省', '15': '内蒙古自治区',
'21': '辽宁省', '22': '吉林省', '23': '黑龙江省',
'31': '上海市', '32': '江苏省', '33': '浙江省', '34': '安徽省', '35': '福建省', '36': '江西省', '37': '山东省',
'41': '河南省', '42': '湖北省', '43': '湖南省', '44': '广东省', '45': '广西壮族自治区', '46': '海南省',
'50': '重庆市', '51': '四川省', '52': '贵州省', '53': '云南省', '54': '西藏自治区',
'61': '陕西省', '62': '甘肃省', '63': '青海省', '64': '宁夏回族自治区', '65': '新疆维吾尔自治区',
'71': '台湾省', '81': '香港特别行政区', '82': '澳门特别行政区'
}
class MainFrame(wx.Frame):
def __init__(self, *args, **kw):
super(MainFrame, self).__init__(*args, **kw)
self.InitUI()
def InitUI(self):
self.SetTitle("身份证号码验证")
self.SetSize((400, 300))
self.Centre()
# 创建菜单栏
menubar = wx.MenuBar()
operationMenu = wx.Menu()
editMenu = wx.Menu()
helpMenu = wx.Menu()
verifyItem = operationMenu.Append(wx.ID_ANY, '验证')
clearItem = editMenu.Append(wx.ID_ANY, '清除')
copyItem = editMenu.Append(wx.ID_ANY, '复制')
aboutItem = helpMenu.Append(wx.ID_ANY, '关于')
helpItem = helpMenu.Append(wx.ID_ANY, '帮助')
menubar.Append(operationMenu, '&操作')
menubar.Append(editMenu, '&编辑')
menubar.Append(helpMenu, '&帮助')
self.SetMenuBar(menubar)
# 绑定菜单事件
self.Bind(wx.EVT_MENU, self.OnVerify, verifyItem)
self.Bind(wx.EVT_MENU, self.OnClear, clearItem)
self.Bind(wx.EVT_MENU, self.OnCopy, copyItem)
self.Bind(wx.EVT_MENU, self.OnAbout, aboutItem)
self.Bind(wx.EVT_MENU, self.OnHelp, helpItem)
# 创建工具栏
toolbar = self.CreateToolBar()
verify_tool = toolbar.AddTool(wx.ID_ANY, '验证', wx.ArtProvider.GetBitmap(wx.ART_INFORMATION))
clear_tool = toolbar.AddTool(wx.ID_ANY, '清除', wx.ArtProvider.GetBitmap(wx.ART_DELETE))
copy_tool = toolbar.AddTool(wx.ID_ANY, '复制', wx.ArtProvider.GetBitmap(wx.ART_COPY))
about_tool = toolbar.AddTool(wx.ID_ANY, '关于', wx.ArtProvider.GetBitmap(wx.ART_HELP))
help_tool = toolbar.AddTool(wx.ID_ANY, '帮助', wx.ArtProvider.GetBitmap(wx.ART_QUESTION))
toolbar.Realize()
# 绑定工具栏事件
self.Bind(wx.EVT_TOOL, self.OnVerify, verify_tool)
self.Bind(wx.EVT_TOOL, self.OnClear, clear_tool)
self.Bind(wx.EVT_TOOL, self.OnCopy, copy_tool)
self.Bind(wx.EVT_TOOL, self.OnAbout, about_tool)
self.Bind(wx.EVT_TOOL, self.OnHelp, help_tool)
# 创建输入框
self.input_field = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
self.input_field.SetHint("请输入身份证号码")
# 创建结果显示区域
self.result_text = wx.StaticText(self, label="")
# 布局
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.input_field, 0, wx.ALL | wx.EXPAND, 10)
sizer.Add(self.result_text, 0, wx.ALL | wx.EXPAND, 10)
self.SetSizer(sizer)
def OnVerify(self, e):
self.verify_id_number()
def OnClear(self, e):
self.input_field.Clear()
def OnCopy(self, e):
if self.input_field.GetValue():
self.input_field.Copy()
def OnAbout(self, e):
wx.MessageBox("关于", "版本 1.0")
def OnHelp(self, e):
wx.MessageBox("帮助", "请输入有效的身份证号码进行验证")
def verify_id_number(self):
id_number = self.input_field.GetValue()
# 非数字验证
if not re.match(r'^\d{17}[\dX]$', id_number):
self.result_text.SetLabel("身份证号码包含非数字字符,应为17位数字加1位校验位(数字或X)")
self.result_text.SetForegroundColour(wx.RED)
return
if len(id_number) != 18:
self.result_text.SetLabel("身份证号码长度不正确,应为18位")
self.result_text.SetForegroundColour(wx.RED)
return
# 地区码验证
area_code = id_number[:6]
if area_code[:2] not in area_codes:
self.result_text.SetLabel(f"地区码无效,前两位应为有效的地区码,如'11'代表北京市")
self.result_text.SetForegroundColour(wx.RED)
return
# 出生日期验证
birth_date = id_number[6:14]
try:
datetime.datetime.strptime(birth_date, '%Y%m%d')
except ValueError:
self.result_text.SetLabel("出生日期无效,格式应为YYYYMMDD,如1990年1月1日应为19900101")
self.result_text.SetForegroundColour(wx.RED)
return
# 校验位验证
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
check_code = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
sum_value = sum(int(id_number[i]) * weight[i] for i in range(17))
if check_code[sum_value % 11] == id_number[17]:
self.result_text.SetLabel("身份证号码有效")
self.result_text.SetForegroundColour(wx.GREEN)
else:
self.result_text.SetLabel("校验位无效,请检查最后一位校验位")
self.result_text.SetForegroundColour(wx.RED)
if __name__ == '__main__':
app = wx.App(False)
frame = MainFrame(None)
frame.Show()
app.MainLoop()
代码说明:
运行效果: • 用户在输入框中输入身份证号码,点击工具栏中的“验证”按钮后,程序会根据输入的身份证号码进行非数字、长度、地区码、出生日期和校验位的验证,并在下方显示详细的验证结果和纠正建议。 • 菜单栏提供了“操作”、“编辑”和“帮助”选项,点击后会显示相应的提示信息。 • 工具栏提供了“验证”、“清除”、“复制”、“关于”和“帮助”功能,方便用户操作。 这样,用户不仅可以验证身份证号码,还可以通过菜单栏和工具栏获取更多信息和帮助,并进行快捷操作。