tkinter GUI版通信录管理系统
实验要求
设计一个GUI版的通信录,连接data.db数据库(数据库在QQ群文件中),把数据库里的通信录记录读取出来,在窗口上放置用来显示通信录信息的表格,使用Treeview组件实现,然后在表格中显示姓名等6个字段,并实现添加(不能重复添加某人信息)和删除记录的功能。提高功能要求在添加记录时有出错处理和信息提示。界面如下图:
提示:以下是本篇文章正文内容,下面案例可供参考
完整代码
import sqlite3
import tkinter
import tkinter.ttk
import tkinter.messagebox
def doSql(sql):
'''用来执行SQL语句,尤其是INSERT和DELETE语句'''
with sqlite3.connect('data.db') as conn:
cur = conn.cursor()
cur.execute(sql)
conn.commit()
# 创建tkinter应用程序窗口
root = tkinter.Tk()
# 设置窗口大小和位置
root.geometry('500x500+400+300')
# 不允许改变窗口大小
root.resizable(False, False)
# 设置窗口标题
root.title('通信录管理系统')
# 在窗口上放置标签组件和用于输入姓名的文本框组件
lbName = tkinter.Label(root, text='姓名:')
lbName.place(x=10, y=10, width=40, height=20)
entryName = tkinter.Entry(root)
entryName.place(x=60, y=10, width=150, height=20)
# 在窗口上放置标签组件和用于选择性别的组合框组件
lbSex = tkinter.Label(root, text='性别:')
lbSex.place(x=220, y=10, width=40, height=20)
comboSex = tkinter.ttk.Combobox(root,
values=('男', '女'))
comboSex.place(x=270, y=10, width=150, height=20)
# 在窗口上放置标签组件和用于输入年龄的文本框组件
lbAge = tkinter.Label(root, text='年龄:')
lbAge.place(x=10, y=50, width=40, height=20)
entryAge = tkinter.Entry(root)
entryAge.place(x=60, y=50, width=150, height=20)
# 在窗口上放置标签组件和用于输入部门的文本框组件
lbDepartment = tkinter.Label(root, text='部门:')
lbDepartment.place(x=220, y=50, width=40, height=20)
entryDepartment = tkinter.Entry(root)
entryDepartment.place(x=270, y=50, width=150, height=20)
# 在窗口上放置标签组件和用于输入电话号码的文本框组件
lbTelephone = tkinter.Label(root, text='电话:')
lbTelephone.place(x=10, y=90, width=40, height=20)
entryTelephone = tkinter.Entry(root)
entryTelephone.place(x=60, y=90, width=150, height=20)
# 在窗口上放置标签组件和用于输入QQ号码的文本框组件
lbQQ = tkinter.Label(root, text='QQ:')
lbQQ.place(x=220, y=90, width=40, height=20)
entryQQ = tkinter.Entry(root)
entryQQ.place(x=270, y=90, width=150, height=20)
# 在窗口上放置用来显示通信录信息的表格,使用Treeview组件实现
frame = tkinter.Frame(root)
frame.place(x=0, y=180, width=480, height=280)
# 滚动条
scrollBar = tkinter.Scrollbar(frame)
scrollBar.pack(side=tkinter.RIGHT, fill=tkinter.Y)
#Treeview组件
treeAddressList = tkinter.ttk.Treeview(frame,
columns=('c1', 'c2', 'c3','c4', 'c5', 'c6'),
show="headings",
yscrollcommand = scrollBar.set)
treeAddressList.column('c1', width=70, anchor='center')
treeAddressList.column('c2', width=50, anchor='center')
treeAddressList.column('c3', width=50, anchor='center')
treeAddressList.column('c4', width=110, anchor='center')
treeAddressList.column('c5', width=100, anchor='center')
treeAddressList.column('c6', width=100, anchor='center')
treeAddressList.heading('c1', text='姓名')
treeAddressList.heading('c2', text='性别')
treeAddressList.heading('c3', text='年龄')
treeAddressList.heading('c4', text='部门')
treeAddressList.heading('c5', text='电话')
treeAddressList.heading('c6', text='QQ')
treeAddressList.pack(side=tkinter.LEFT, fill=tkinter.Y)
# Treeview组件与垂直滚动条结合
scrollBar.config(command=treeAddressList.yview)
# 定义Treeview组件的左键单击事件,并绑定到Treeview组件上
# 单击鼠标左键,设置变量nameToDelete的值,然后可以使用“删除”按钮来删除
nameToDelete = tkinter.StringVar('')
def treeviewClick(event):
if not treeAddressList.selection():
return
item = treeAddressList.selection()[0]
nameToDelete.set(treeAddressList.item(item, 'values')[0])
treeAddressList.bind('<Button-1>', treeviewClick)
def bindData():
'''把数据库里的通信录记录读取出来,然后在表格中显示'''
# 删除表格中原来的所有行
for row in treeAddressList.get_children():
treeAddressList.delete(row)
# 读取数据库中的所有数据
with sqlite3.connect('data.db') as conn:
cur = conn.cursor()
cur.execute('select * from addressList order by id')
temp = cur.fetchall()
# 把数据插入表格
for i, item in enumerate(temp):
treeAddressList.insert('', i, values=item[1:])
# 调用函数,把数据库中的记录显示到表格中
bindData()
# 在窗口上放置用于添加通信录的按钮,并设置按钮单击事件函数
def buttonAddClick():
# 检查姓名
name = entryName.get().strip()
if name == '':
tkinter.messagebox.showerror(title='抱歉', message='姓名不能为空!')
return
# 姓名不能重复
with sqlite3.connect('data.db') as conn:
cur = conn.cursor()
cur.execute('select COUNT(id) FROM addressList WHERE name="{}"'.format(name))
c = cur.fetchone()[0]
if c!=0:
tkinter.messagebox.showerror(title='抱歉', message='姓名不能重复!')
return
# 获取选择的性别
sex = comboSex.get()
if sex not in ('男', '女'):
tkinter.messagebox.showerror(title='抱歉', message='性别不能为空!')
return
# 检查年龄
age = entryAge.get().strip()
if age == '':
tkinter.messagebox.showerror(title='抱歉', message='年龄不能为空!')
return
# 检查部门
department = entryDepartment.get().strip()
if department == '':
tkinter.messagebox.showerror(title='抱歉', message='部门不能为空!')
return
# 检查电话号码
telephone = entryTelephone.get().strip()
if telephone=='' or (not telephone.isdigit()):
tkinter.messagebox.showerror(title='抱歉', message='电话号码为空或错误!')
return
# 检查QQ号码
qq = entryQQ.get().strip()
if qq=='' or (not qq.isdigit()):
tkinter.messagebox.showerror(title='抱歉', message='QQ号码为空或错误!')
return
# 所有输入都通过检查,插入数据库
sql = 'INSERT INTO addressList(name,sex,age,department,telephone,qq) VALUES("'\
+ name + '","' + sex + '",' + str(age) + ',"' + department + '","'\
+ telephone + '","' + qq + '")'
doSql(sql)
# 添加记录后,更新表格中的数据
bindData()
buttonAdd = tkinter.Button(root, text='添加', command=buttonAddClick)
buttonAdd.place(x=100, y=140, width=80, height=20)
# 在窗口上放置用于删除通信录的按钮,并设置按钮单击事件函数
def buttonDeleteClick():
name = nameToDelete.get()
if name == '':
tkinter.messagebox.showerror(title='抱歉', message='没有选择记录!')
return
# 如果已经选择了一条通信录,执行SQL语句将其删除
sql = 'DELETE FROM addressList WHERE name="{}"'.format(name)
doSql(sql)
tkinter.messagebox.showinfo('恭喜', '删除成功')
# 重新设置变量为空字符串
nameToDelete.set('')
# 更新表格中的数据
bindData()
buttonDelete = tkinter.Button(root, text='删除', command=buttonDeleteClick)
buttonDelete.place(x=240, y=140, width=80, height=20)
root.mainloop()
运行结果
设置参数:姓名:王五,性别:男,年龄:20,部门:财务部,电话:666,QQ:888
实验结果:
设置参数:姓名:张三,性别:男,年龄:35,部门:人事部,电话:1234567,QQ:101010
实验结果:
选中一条记录,将其删除
实验结果: