建立添加区域A1
检测工号,姓名,性别,出生,职位是否正确。
建立A1窗口
def A1():
r1=Tk()
r1.title('添加')
r1.geometry('370x270+300+100')
b1=Label(r1,text='工号')
b1.place(x=60,y=20)
e1=Entry(r1)
e1.place(x=200,y=20,width=120,height=20)
b2=Label(r1, text='姓名')
b2.place(x=60,y=50)
e2=Entry(r1)
e2.place(x=200,y=50,width=120,height=20)
b3=Label(r1, text='性别')
b3.place(x=60,y=80)
e3=Entry(r1)
e3.place(x=200,y=80,width=120,height=20)
b4=Label(r1, text='出生日期')
b4.place(x=60,y=110)
e4=Entry(r1)
e4.place(x=200,y=110,width=120,height=20)
b5=Label(r1, text='职位')
b5.place(x=60,y=140)
e5=Entry(r1)
e5.place(x=200,y=140,width=120,height=20)
button1=Button(r1,text=' 添加 ',command=lambda :tianjia())
button1.place(x=60,y=180,width=120,height=50)
button2=Button(r1, text=' 返回 ',command=r1.destroy)
button2.place(x=200,y=180,width=120,height=50)
r1.mainloop()
A1()
button1=Button(r1,text=' 添加 ',command=lambda :tianjia())这个匿名函数要做的就是检测与添加。
先用数组代替,最后完整代码连接sql
array1=['1','许佳琪','男','19990824',"IS"]
array2=['2','c','女','19980615','CX']
array3=['3','张鹏辉','男','19990621','II']
ayy=[array1,array2,array3]
获取得到的信息,然后对每个数据进行检测
gh=e1.get()
xm=e2.get()
xb=e3.get()
cs=e4.get()
zw=e5.get()
建立正则表达式处理出生日期
a=re.compile(r'''((19[0-9]{2}|20[01][0-9]|202[012]) #1900-2022
((0[13578]|1[02]) (0[1-9]|[12][0-9]|3[01])|
(0[469]|1[01]) (0[1-9]|[12][0-9]|30])|
(02(0[1-9]|1[0-9]|2[0-8]))))|
(((19|20)(0[48]|[2468][048]|[13579][26])|
((0[48]|[2468][048]|[3579][26])00))0229)
''',re.VERBOSE)
#正则表达式,匹配出生日期
匹配每项数据
将待处理的数据放在一个list中【list=[gh,xm,xb,cs,zw]】只是为了数据对齐,可以不设
定义四项初值,检测结束全为真则执行添加否则添加失败重新添加【tgh,txb,tcs,tzw=1,1,1,1】
若有相同工号则弹框提示工号重复,工号小于0大于9999则工号错误
for i in ayy:
if int(list[0])<0 or int(list[0])>9999:
tgh=0
messagebox.showinfo('error','工号错误')
break
if i[0]==list[0]:
tgh=0
messagebox.showinfo('issue','工号重复')
break
判断性别是否在男女中,出生是否正确,职位是否在给定的职位中,第四条if则为真执行添加
if xb not in ['男','女']:
txb=0
messagebox.showinfo('提示','性别错误')
if not a.search(cs[:8]):
tcs=0
messagebox.showinfo('issue','出生错误')
if zw not in list_zw:
tzw=0
messagebox.showinfo('提示','职位错误')
if tgh and txb and tcs and tzw:
ayy.append(list)
#print(ayy)打印出已存在的数据
第四行有个错误发现了吗,输入199708271不仅能通过正则表达式的匹配还能通过这里的if,添加
!len(cs)==8 检测长度错误
添加成功则清框,添加失败则不清框,这个操作就要放在上面的第4个if下执行清框操作
def clear():
e1.delete(0,END)
e2.delete(0,END)
e3.delete(0,END)
e4.delete(0,END)
e5.delete(0,END)
到此添加新人的基本要求就结束了,将数组更换为连接数据库的样子
from tkinter import messagebox # 消息框模块
import re # 导入正则表达式模块
import pyodbc # 导入数据库模块
from tkinter import * # 窗口模块
list_zw=['AI','CX','II','HR','HQ','CW','IS']
def A1(): # 添加
a = re.compile(r'''((19[0-9]{2}|20[01][0-9]|202[012]) #1900-2022
((0[13578]|1[02]) (0[1-9]|[12][0-9]|3[01])|
(0[469]|1[01]) (0[1-9]|[12][0-9]|30])|
(02(0[1-9]|1[0-9]|2[0-8]))))|
(((19|20)(0[48]|[2468][048]|[13579][26])|
((0[48]|[2468][048]|[3579][26])00))0229)
''', re.VERBOSE) # 建立正则表达式用来匹配1900年到2022年的出生日期
def clear(): # 清空输入框
e1.delete(0, END)
e2.delete(0, END)
e3.delete(0, END)
e4.delete(0, END)
e5.delete(0, END)
def tianjia():
tgh, txb, tcs, tzw = 1, 1, 1, 1 # 设置初始值为均为真
co = pyodbc.connect('DRIVER={sql server};SERVER=127.0.0.1;DATABASE=rsgldb') # 连接数据库
youbiao = co.cursor() # 建立数据库的游标
sql = "select * from rs" # 数据库的程序语句
youbiao.execute(sql) # 执行数据库的语句
arr = youbiao.fetchone() # 游标下移
gh = e1.get() # 得到输入的工号
if int(gh)<0:
messagebox.showinfo('issue', '工号错误')
while arr:
if arr[0] == gh: # 判断输入的工号是否与数据库中的工号相重复,若重复则置为0并跳出该循环
tgh = 0
messagebox.showinfo('issue', '工号重复') # 弹出错误提示框
break
arr = youbiao.fetchone()
# 从输入框得到姓名,性别,出生日期,和职位
xm = e2.get()
xb = e3.get()
cs = e4.get()
zw = e5.get()
# list=[gh,xm,xb,cs,zw]
if xb not in ['男', '女']: # 判断性别
txb = 0
messagebox.showinfo('提示', '性别错误')
if (not a.search(cs) )or (len(cs)!=8): # 利用正则式匹配出生
# 程序需要添加如果输入的不是8位
tcs = 0
messagebox.showinfo('issue', '出生错误')
# if zw not ['AI', 'CX', 'II', 'HR', 'HQ', 'CW', 'IS']: # 设定该公司的部门
if zw not in list_zw: # 设定该公司的部门
tzw = 0
messagebox.showinfo('提示', '职位错误')
if tgh and txb and tcs and tzw: # 工号,性别,出生,职位,均没错则执行
sql2 = "insert rs values('{0}','{1}','{2}','{3}','{4}')".format(gh, xm, xb, cs, zw) # 向人事管理数据库的人事表中插入此人
youbiao.execute(sql2) # 执行sql语句
co.commit() # 提交该语句,以达到数据库数据同步
youbiao.close() # 关闭游标
co.close() # 关闭数据库连接
messagebox.showinfo('提示', '添加成功')
clear()#添加失败才会清框
#clear() # 点击添加后自动清空输入框,不管添加成功还是失败
# 添加的布局,其余布局均参照该布局,b1相距此窗口横距(左边框)为60px,相距上距(上边框)为20px,e1横距为200px,上距为20px,
# 后面的每行横距均与b1行对齐,且每行的高度为20px
# 每行相距10px
r1 = Tk()
r1.title('添加')
r1.geometry('370x270+300+100')
b1 = Label(r1, text='工号')
b1.place(x=60, y=20)
e1 = Entry(r1)
e1.place(x=200, y=20, width=120, height=20)
b2 = Label(r1, text='姓名')
b2.place(x=60, y=50)
e2 = Entry(r1)
e2.place(x=200, y=50, width=120, height=20)
b3 = Label(r1, text='性别')
b3.place(x=60, y=80)
e3 = Entry(r1)
e3.place(x=200, y=80, width=120, height=20)
b4 = Label(r1, text='出生日期')
b4.place(x=60, y=110)
e4 = Entry(r1)
e4.place(x=200, y=110, width=120, height=20)
b5 = Label(r1, text='职位')
b5.place(x=60, y=140)
e5 = Entry(r1)
e5.place(x=200, y=140, width=120, height=20)
button1 = Button(r1, text=' 添加 ', command=lambda: tianjia())
button1.place(x=60, y=180, width=120, height=50)
button2 = Button(r1, text=' 返回 ', command=r1.destroy) # 关闭此窗口,返回主窗口
button2.place(x=200, y=180, width=120, height=50)
r1.mainloop()
A1()
添加成功会有一个弹窗,然后打开sql->新建查询->
use rsgldb
go
select * from rs
执行【选中要执行的代码】之后就能看到添加进去的成员
数据库学的不好,如果有更快的检测语句,欢迎指出