基于wxPython的GUI小程序开发实例——身份证号升位器

来源:转载

Python在图形用户界面(GUI)程序的开发中,可用的工具包很多,wxPython是相对成熟的一个,因此本文以以身份证号升位器为例,介绍wxPython中常用的控件、使用方法以及GUI程序的开发过程。


0. 工具包的下载与准备


开发环境为Windows7,软件版本我用的是Python2.7,wxPython3.0-win64,下载安装过程不再赘述。编辑器采用的是Python自带的编辑器。


1. 身份证号升位规则及升位函数idup的编写


身份证号升位器的核心是身份证号15位转18位的转换规则:(1)年份由两位(83)升级为(1983),(2)最后增加一位校验位,校验码计算方法:将身份证前十七位数分别乘以不同系数,从第一至十七位的系数分别为7、9、10、5、8、4、2、1、6、3、7、9、10、5、8、4、2,将这十七位数字和系数相乘的结果相加,用加出来的和除以11,看看余数是多少。余数只可能有0、1、2、3、4、5、6、7、8、9、10这十一个数字,其分别对应的最后一位身份证的号码为1、0、X、9、8、7、6、5、4、3、2。Python代码如下:


def idup(x):
t=(int(x[0])*7+ int(x[1])*9+ int(x[2])*10+ int(x[3])*5+ int(x[4])*8 /
+ int(x[5])*4 +1*2 +9*1 + int(x[6])*6 + int(x[7])*3 + int(x[8])*7 /
+ int(x[9])*9 + int(x[10])*10 + int(x[11])*5 + int(x[12])*8 /
+ int(x[13])*4 + int(x[14])*2)%11
ind=['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
return x[:6]+'19'+x[6:]+ind[t]
print '请输入15位身份证号:'
ssid=raw_input()
if len(ssid)==18:
print '已经是18位了不用转换'
elif len(ssid)==15:
print idup(ssid)
else:
print '身份证号长度不对'

上半部分是升位函数的主体,下半部分的存在是为了验证这段函数是否靠谱,我在Shell下以命令行的模式进行了验证,验证结果如下:



结果证明idup的函数靠谱,这样可以接下去做界面了。做界面之前可以把下半部分的测试代码标注掉(alt+3)或者删去。


2. GUI界面的制作


在做之前最好画一个草图,至少知道需要做成什么样子,我的草图是这样的:



接下来是我的代码:


app=wx.App()
win=wx.Frame(None, title="身份证号升位", size=(400,200))
bkg=wx.Panel(win)
search_box=wx.TextCtrl(bkg,style=wx.TE_MULTILINE)
result_box=wx.TextCtrl(bkg,style=wx.TE_MULTILINE)
hbox1=wx.BoxSizer()
hbox1.Add(search_box, proportion=1,flag=wx.EXPAND,border=5)
searchButton=wx.Button(bkg, label='升位',size=(60,25))
hbox2=wx.BoxSizer()
hbox2.Add(searchButton,proportion=0,flag=wx.EXPAND,border=5)
hbox3=wx.BoxSizer()
hbox3.Add(result_box,proportion=1,flag=wx.EXPAND,border=5)
vbox=wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox1,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(hbox2,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(hbox3,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
bkg.SetSizer(vbox)
win.Show()
app.MainLoop()

接下来上效果图:



看起来还不错,但还是个空架子,现在要把具体的功能给添加到按钮里去


3. 添加事件函数upCase


def upCase(event):
id15=search_box.GetValue() ##从上面的文本框里取值
if len(id15)==15:##位数正确的时候进行转换
id18=idup(id15)
result_box.SetValue(id18)
elif len(id15)==18: ##不需要转换的情况
dlg=wx.MessageDialog(win,'已经是18位了不用转换','提示',wx.OK)
dlg.ShowModal()
dlg.Destroy()
else: ##位数不正确时报错
dlg=wx.MessageDialog(win,'身份证号长度不对','提示',wx.OK)
dlg.ShowModal()
dlg.Destroy()

然后将upCase函数与“升位”按钮关联起来


searchButton.Bind(wx.EVT_BUTTON,upCase)

4. 模块整合与程序修饰


最后的阶段是把以上的模块整合到一个程序里面,整合完成的程序如下:


# -*- coding: gbk -*-
#!/usr/bin/env python
import wx
def idup(x):
t=(int(x[0])*7+ int(x[1])*9+ int(x[2])*10+ int(x[3])*5+ int(x[4])*8 /
+ int(x[5])*4 +1*2 +9*1 + int(x[6])*6 + int(x[7])*3 + int(x[8])*7 /
+ int(x[9])*9 + int(x[10])*10 + int(x[11])*5 + int(x[12])*8 /
+ int(x[13])*4 + int(x[14])*2)%11
ind=['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']
return x[:6]+'19'+x[6:]+ind[t]
##print '请输入15位身份证号:'
##ssid=raw_input()
##if len(ssid)==18:
## print '已经是18位了不用转换'
##elif len(ssid)==15:
## print idup(ssid)
##else:
##print '身份证号长度不对'
#事件函数
def upCase(event):
id15=search_box.GetValue() ##从上面的文本框里取值
if len(id15)==15:##位数正确的时候进行转换
id18=idup(id15)
result_box.SetValue(id18)
elif len(id15)==18: ##不需要转换的情况
dlg=wx.MessageDialog(win,'已经是18位了不用转换','提示',wx.OK)
dlg.ShowModal()
dlg.Destroy()
else: ##位数不正确时报错
dlg=wx.MessageDialog(win,'身份证号长度不对','提示',wx.OK)
dlg.ShowModal()
dlg.Destroy()

#界面布局
app=wx.App()
win=wx.Frame(None, title="身份证号升位", size=(400,200))
bkg=wx.Panel(win)
search_box=wx.TextCtrl(bkg,style=wx.TE_MULTILINE)
result_box=wx.TextCtrl(bkg,style=wx.TE_MULTILINE)
hbox1=wx.BoxSizer()
hbox1.Add(search_box, proportion=1,flag=wx.EXPAND,border=5)
searchButton=wx.Button(bkg, label='升位',size=(60,25))
searchButton.Bind(wx.EVT_BUTTON,upCase)
hbox2=wx.BoxSizer()
hbox2.Add(searchButton,proportion=0,flag=wx.EXPAND,border=5)
hbox3=wx.BoxSizer()
hbox3.Add(result_box,proportion=1,flag=wx.EXPAND,border=5)
vbox=wx.BoxSizer(wx.VERTICAL)
vbox.Add(hbox1,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(hbox2,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
vbox.Add(hbox3,proportion=0,flag=wx.EXPAND | wx.ALL,border=5)
bkg.SetSizer(vbox)
win.Show()
app.MainLoop()

小结:wxPython编写的GUI程序分为3个部分:图形界面、响应事件、事件对应的后台函数(这里是idup函数)。个人感觉应该分步编写、分别测试,各部分没问题了之后,再整合在一起。制作好的程序是一个.py后缀名的文件,只有在安装了Python的系统环境下才能运行,如果要转成.exe的可执行文件可以采用py2exe的程序进行打包。图形界面部分对控件的属性和参数还不是很熟悉,所以没有采用函数与嵌套的写法,尽管重复的代码看起来有点多,但是条理相对明晰,对于初学者可读性相对较强。另外本次整理中对于一些控件的使用方法细节上没有展开,后期有时间再做补充与完善。

分享给朋友:
您可能感兴趣的文章:
随机阅读: