【案例】做一个电话簿(四)

前言

今天我们继续设计电话簿,主要是结合数据库和 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 和 数据库结合起来。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jia ming

谢谢投食哦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值