前言
今天我们继续设计电话簿,主要是结合数据库和 GUI 将项目完成。
代码汇总
import tkinter as tk
import os
import sqlite3
# 界面对象的基本参数设置
root = tk.Tk()
root.title("电话簿")
root.geometry('1096x474+250+250')
# 设置界面是否可以随意拉伸
# root.resizable(False, False)
all_data = []
check_index = 0
# 本脚本名称
scriptPath = __file__
# scriptName = os.path.basename(__file__)
# 数据库创建路径
DBName = "\phoneNumberDB.db"
DBPath = os.path.split(os.path.realpath(__file__))[0] + DBName
def create_database():
"""
创建数据 ProjectDataBase.db
"""
conn = sqlite3.connect(DBPath)
conn.close()
print('** 创建数据库 %s 成功! **' % DBName)
create_tables()
def create_tables():
"""
创建数据库表
"""
conn = sqlite3.connect(DBPath)
c = conn.cursor()
# 执行 DDL 语句创建 class_table
c.execute("""
create table phoneNumber_table(
ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
Name varchar(20),
Number char(11),
Email char(30),
Note text)
""")
# 关闭游标
c.close()
# 关闭连接
conn.close()
def Insert_data(dataTuple=()):
"""
插入数据
"""
conn = sqlite3.connect(DBPath)
c = conn.cursor()
# c.execute('PRAGMA foreign_keys = ON;')
c.execute(
'insert into phoneNumber_table values(?, ?, ? ,? ,?)',
dataTuple
)
conn.commit()
c.close()
conn.close()
print('插入数据:', dataTuple, '成功!')
def check_data():
"""
查看电话簿中数据
"""
conn = sqlite3.connect(DBPath)
c = conn.cursor()
# c.execute('PRAGMA foreign_keys = ON;')
c.execute(
'select ID, Name, Number, Email, Note from phoneNumber_table'
)
while True:
row = c.fetchone()
if not row:
break
all_data.append(row)
c.close()
conn.close()
print('查看数据成功!')
return all_data
def draw():
"""
设计界面
"""
def show_data():
s = ""
for i in all_data:
s += str(i) + "\n\n"
return s
# 放置多行文本
text = tk.Text(root)
text.grid(row=0, column=0, rowspan=3, columnspan=3)
text.insert("insert", show_data())
v = tk.StringVar()
# 详细信息
label = tk.Label(root, textvariable=v)
label.grid(row=0, column=3, columnspan=3, rowspan=2)
v.set(
str(all_data[check_index])
)
def InsertBtn_command(btn=None):
pass
def lastOneBtn_command(btn=None):
global check_index
check_index -= 1
v.set(str(all_data[check_index]))
def NextBtn_command(btn=None):
global check_index
check_index += 1
v.set(str(all_data[check_index]))
# 按钮
key = None
lastOneBtn = tk.Button(
root,
text="上一个",
relief=tk.GROOVE,
command=lambda idx=key: lastOneBtn_command(idx))
lastOneBtn.grid(row=2, column=3)
InsertBtn = tk.Button(
root,
text="插入",
relief=tk.GROOVE,
command=lambda idx=key: InsertBtn_command(idx))
InsertBtn.grid(row=2, column=4)
NextBtn = tk.Button(
root,
text="下一个",
relief=tk.GROOVE,
command=lambda idx=key: NextBtn_command(idx))
NextBtn.grid(row=2, column=5)
if __name__ == "__main__":
# create_database()
# Insert_data(dataTuple=(None, '王催化', '123-456', 'xxx@gmail.com', ''))
# Insert_data(dataTuple=(None, 'xxx', '123-456', 'xxx@gmail.com', ''))
# Insert_data(dataTuple=(None, 'yyy', '123-456', 'xxx@gmail.com', ''))
# Insert_data(dataTuple=(None, 'zzz', '123-456', 'xxx@gmail.com', ''))
check_data()
draw()
root.mainloop()
所做的工作
数据结构
all_data = []
check_index = 0
all_data
存储了数据库中的每条信息,类似下面的样式。
[(1, '王催化', '123-456', 'xxx@gmail.com', ''),(2, 'xxx', '123-456', 'xxx@gmail.com', '')]
check_index
代表了右侧当前显示的是哪一条内容。
功能说明
create_database()
Insert_data(dataTuple=(None, '王催化', '123-456', 'xxx@gmail.com', ''))
Insert_data(dataTuple=(None, 'xxx', '123-456', 'xxx@gmail.com', ''))
Insert_data(dataTuple=(None, 'yyy', '123-456', 'xxx@gmail.com', ''))
Insert_data(dataTuple=(None, 'zzz', '123-456', 'xxx@gmail.com', ''))
check_data()
draw()
root.mainloop()
开始运行的时候,需要创建数据库,插入数据。
运行 check_data()
会遍历所有的数据库内容,保存到 all_data
数据结构中。
def lastOneBtn_command(btn=None):
global check_index
check_index -= 1
v.set(str(all_data[check_index]))
上一个、下一个按钮会改变 check_index
的值,从而改变右侧当前结果。
运行截图
后记
以上就是我们今天的内容,我们的电话簿就完成了,但是还有很多功能我们还没有涉及到,毕竟我们这个项目的目的就是将 GUI 和 数据库结合起来。