【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

这篇具有很好参考价值的文章主要介绍了【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 实现功能

(1)管理员功能

  • 一个管理员编号对应一个密码,且需要有管理员注册密匙。
  • 可以在图书信息表中录入、修改、删除图书。
  • 可以在图书信息表中查询书籍。
  • 可以编辑图书借阅、归还信息。
  • 可以编辑欠款信息。
  • 可以编辑读者信息表。

(2)读者功能

  • 图书馆注册,获得读者编号。
  • 可以在图书信息表中查阅书籍。
  • 可以查看自己的借阅、归还和欠款信息,不能查看他人的。
  • 可以自主借阅图书,将改变该书的借阅状态。
  • 可以归还图书,系统自动计算应交的罚金。
  • 向管理员提交罚金后,管理员更新欠款信息表。

二 数据流图

【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

三 概念结构设计

【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

四 文件目录

【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现

五 源码:main.py

from sqlite3 import *
from tkinter import *
from tkinter.messagebox import *

import datetime
import time

# 初始化图形界面
win=Tk() # 创建窗口
win.geometry('600x600+200+200') # 设置窗口大小和位置rt.geometry('宽 x 高+左边距+上边距')
win.title('图书馆') # 设置窗口名
win.iconbitmap('pro.ico') # 设置窗口图标(左上角)
# 把背景图放到一个标签里再显示到屏幕上
background=PhotoImage(file='bg.gif') # 画布显示图像图像对象=PhotoImage(file=图像名称)必须是gif图片
lab1=Label(image=background) # 创建标签
lab1.place(x=0,y=0)
# 主要标签框架
manfra=LabelFrame() # 标签框架
manfra.pack() # 控件摆放
# 存数据库名
dbfile='Library.dat'

# 返回主界面
def back_main():
    menubar = Menu(win)
    win.config(menu=menubar)
    file_back=Menu(menubar, tearoff=0)
    file_back.add_command(label='返回',command=identity)
    menubar.add_cascade(label='主页面',menu=file_back)


# 读者
def Reader():
    cid='0'
    # 查找读者(根据读者编号找)
    def find(key_id):
        cn = connect(dbfile)
        cur = cn.execute('select * from Readers where R_id=?', (key_id,))
        user = cur.fetchall()
        if len(user) > 0:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 匹配读者编号和密码
    def match(key_id, key_sec):
        cn = connect(dbfile)
        cur = cn.execute('select R_secret from Readers where R_id=?', (key_id,))
        s = cur.fetchall()
        x=" ".join('%s' %i for i in s) # s是列表,先转化为字符串再比较
        if x == key_sec:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 读者注册
    def Reader_sign():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='读者注册')
        manfra.pack(anchor=CENTER, pady=120, ipadx=5, ipady=5)
        ## 输入区域框架
        tf = Frame(manfra)  # 定义放置控件的框架
        tf.pack()
        ## 输入需要添加的读者编号
        Label(tf, text='编号', anchor=E).grid(row=1, column=1)
        R_id = StringVar()
        txtcno = Entry(tf, textvariable=R_id)
        txtcno.grid(row=1, column=2)
        ## 输入需要添加的姓名
        Label(tf, text='姓名', anchor=E).grid(row=2, column=1)
        R_name = StringVar()
        txtcna = Entry(tf, textvariable=R_name)
        txtcna.grid(row=2, column=2)
        ## 输入需要添加的读者密码
        Label(tf, text='密码', anchor=E).grid(row=3, column=1)
        R_secret = StringVar()
        txtcns = Entry(tf, textvariable=R_secret)
        txtcns.grid(row=3, column=2)
        ## 输入需要添加的读者电话
        Label(tf, text='电话', anchor=E).grid(row=4, column=1)
        R_telephone = StringVar()
        txtcnt = Entry(tf, textvariable=R_telephone)
        txtcnt.grid(row=4, column=2)

        # 添加清空按钮区域框架
        tf2 = Frame(manfra)
        tf2.pack()
        btok = Button(tf2, text='确定')  # 确定按钮
        btok.grid(row=1, column=1)
        btclear = Button(tf2, text='清空')  # 清空按钮
        btclear.grid(row=1, column=2)

        # 清空已经输入的
        def clearall():
            R_id.set('')
            R_name.set('')
            R_secret.set('')
            R_telephone.set('')

        # 读者注册
        def savenew():
            global cid
            cid = R_id.get()
            cna = R_name.get()
            csec = R_secret.get()
            ctel = R_telephone.get()
            if cid == '':
                showerror('读者注册', '编号无效!')
            else:
                if find(cid) == 1:
                    showerror('读者注册', '编号已经存在!')
                    txtcno.focus()  # 光标集中到户名输入框
                else:
                    if cna == '':
                        showerror('读者注册', '名字输入无效!')
                        txtcna.focus()
                    else:
                        if csec=='':
                            showerror('读者注册', '密码输入无效!')
                            txtcns.focus()
                        else:
                            cn = connect(dbfile)
                            cn.execute('insert into Readers(R_id,R_name,R_secret,R_telephone)\
                             values(?,?,?,?)',
                                       (cid, cna, csec, ctel))
                            cn.commit()
                            cn.close()
                            showinfo('读者注册', '注册成功!')

                            global manfra
                            manfra.destroy()
                            manfra = LabelFrame(text='亲爱的读者')
                            manfra.pack(anchor='center', pady=150, ipadx=10, ipady=10)
                            Label(manfra, text='欢迎来到图书馆~', anchor=E).grid(row=1, column=1)

                            Reader_menu()

        # 按钮命令触发
        btclear.config(command=clearall)  # 清空输入框按钮触发
        btok.config(command=savenew)  # 增加读者按钮触发

    # 读者登录
    def Reader_log():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='读者登录')
        manfra.pack(anchor=CENTER, pady=120, ipadx=5, ipady=5)
        ## 输入区域框架
        tf = Frame(manfra)  # 定义放置控件的框架
        tf.pack()
        ## 输入读者编号
        Label(tf, text='读者编号', anchor=E).grid(row=1, column=1)
        R_id = StringVar()
        txtcno = Entry(tf, textvariable=R_id)
        txtcno.grid(row=1, column=2)
        ## 输入密码
        Label(tf, text='密码', anchor=E).grid(row=2, column=1)
        R_secret = StringVar()
        txtcns = Entry(tf, textvariable=R_secret)
        txtcns.grid(row=2, column=2)

        # 添加按钮区域框架
        tf2 = Frame(manfra)
        tf2.pack()
        btok = Button(tf2, text='确定')  # 确定按钮
        btok.grid(row=1, column=1)
        btclear = Button(tf2, text='清空')  # 清空按钮
        btclear.grid(row=1, column=2)

        # 确定登录后
        def sign_in():
            global cid
            cid = R_id.get()
            cse = R_secret.get()
            if cid == '':
                showerror('读者登录', '编号无效!')
                txtcno.focus()
            else:
                if find(cid) < 0:
                    showerror('读者登录', '编号不存在,请重新输入!')
                    txtcno.focus()
                else:
                    if cse == '':
                        showerror('读者登录', '密码无效!')
                        txtcns.focus()
                    else:
                        if match(cid, cse) < 0:
                            showerror('读者登录', '密码错误!')
                        else:
                            showinfo('读者登录', '登录成功!')

                            global manfra
                            manfra.destroy()
                            manfra = LabelFrame(text='亲爱的读者')
                            manfra.pack(anchor=CENTER, pady=150, ipadx=10, ipady=10)
                            Label(manfra, text='欢迎来到图书馆~', anchor=E).grid(row=1, column=1)

                            Reader_menu()

        # 清空已经输入的
        def clearall():
            R_id.set('')
            R_secret.set('')

        # 按钮命令触发
        btclear.config(command=clearall)  # 清空输入框按钮触发
        btok.config(command=sign_in)  # 增加读者按钮触发

    # 阅览图书
    def Read_Books():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Books')
        Bo = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Bo) == 0:
            showwarning('书籍管理', '没有书籍!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='图书信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=50)
            manfra.columnconfigure(2, minsize=70)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=80)
            manfra.columnconfigure(5, minsize=100)
            manfra.columnconfigure(6, minsize=80)
            manfra.columnconfigure(7, minsize=50)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='编号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='书名',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='作者',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='出版社',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
            Label(manfra, text='类别',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
            Label(manfra, text='状态',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Bo:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 查找书
    def Fine_Book():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='查找图书')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra)
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入书名', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        def dofind():
            bookname = cno.get()
            if bookname == '':
                showerror('查找图书', '书名无效!')
            else:
                cn = connect(dbfile)
                cur = cn.execute('select * from Books where B_name=?', (bookname,))
                inf = cur.fetchall()
                if len(inf) <= 0:
                    showerror('查找图书', '查无此书!')
                else:
                    global manfra
                    manfra.destroy()
                    ## 设置表格大小、位置
                    manfra = LabelFrame(text='查询结果')  # 标签框架
                    manfra.pack(anchor='center', pady=20, ipadx=5, ipady=5)  # 标签框架摆放位置
                    # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
                    manfra.columnconfigure(1, minsize=50)
                    manfra.columnconfigure(2, minsize=70)
                    manfra.columnconfigure(3, minsize=100)
                    manfra.columnconfigure(4, minsize=80)
                    manfra.columnconfigure(5, minsize=100)
                    manfra.columnconfigure(6, minsize=80)
                    manfra.columnconfigure(7, minsize=50)
                    # 在标签框架里创建标签,sticky是对齐方法
                    Label(manfra, text='序号',
                          font=('微软雅黑', 9, 'normal'), bd=1,
                          relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
                    Label(manfra, text='编号',
                          font=('微软雅黑', 9, 'normal'), bd=1,
                          relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
                    Label(manfra, text='书名',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
                    Label(manfra, text='作者',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
                    Label(manfra, text='出版社',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
                    Label(manfra, text='类别',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
                    Label(manfra, text='状态',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

                    rn = 2  # 记录行
                    for x in inf:  # 循环每行
                        cn = 1  # 记录列
                        Label(manfra, text=str(rn - 1),
                              font=('微软雅黑', 9, 'bold'), bd=1,
                              relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                        for a in x:  # 循环每列
                            cn += 1
                            Label(manfra, text=str(a),
                                  font=('微软雅黑', 9), bd=1,
                                  relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                        rn += 1

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮位置

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发

    # 欠款信息
    def Read_Fine():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        manfra.destroy()
        manfra=LabelFrame(text='欠款信息')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)

        global cid
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Fine where R_id=?',(cid,))
        Rea = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库

        ## 开始输出读者信息
        if len(Rea) == 0:
            showwarning('欠款管理', '暂无欠款信息!')  # 警告信息
        else:
            manfra.destroy()
            ## 设置表格大小、位置
            manfra = LabelFrame(text='欠款信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=80)
            manfra.columnconfigure(2, minsize=100)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=100)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='读者编号',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='总罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='已交罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='未交罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Rea:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                    cn += 1
                rn += 1

    # 借阅信息
    def Read_Borrow():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        manfra.destroy()
        manfra = LabelFrame(text='借阅信息')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)

        global cid
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Borrow where R_id=?', (cid,))
        Rea = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库

        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Rea) == 0:
            showwarning('借阅管理', '暂无借阅信息!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='借阅信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=30)
            manfra.columnconfigure(2, minsize=50)
            manfra.columnconfigure(3, minsize=50)
            manfra.columnconfigure(4, minsize=100)
            manfra.columnconfigure(5, minsize=100)
            manfra.columnconfigure(6, minsize=100)
            manfra.columnconfigure(7, minsize=80)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='书籍编号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='读者编号',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='借阅日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='应还日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
            Label(manfra, text='实际归还日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
            Label(manfra, text='罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Rea:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 借书
    def Borrow():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='借阅图书')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        Label(manfra, text='输入书号', anchor=E).grid(row=1, column=1)
        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(manfra, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        def BB():
            global cid
            bookid=cno.get()
            cn = connect(dbfile)  # 连接数据库
            cur = cn.execute('select B_state from Books where B_id=?', (bookid,))
            bookstate = cur.fetchall()  # 获取所有记录

            if bookid=='':
                showerror('借阅书籍','书号错误!')
                txtcno.focus()
            else:
                if len(bookstate)<=0:
                    showerror('借阅书籍','无此书号!')
                    txtcno.focus()
                else:
                    state=[(0,)]
                    if state==bookstate:
                        showerror('借阅书籍','已借出!')
                        txtcno.focus()
                    else:
                        cur=cn.execute('select * from Books where B_id=?',(bookid,))
                        inf=cur.fetchall()
                        Label(manfra, text=inf, anchor=E).grid(row=2, column=2)
                        # 更新书信息
                        borrowdate=datetime.date.today()
                        returndate=borrowdate+datetime.timedelta(days=30)
                        cn.execute('update Books set B_state=?\
                                where B_id=?', (0, bookid))
                        cn.execute('insert into Borrow(B_id,R_id,Borrow_date,Return_date)\
                                   values(?,?,?,?)',(bookid,cid,borrowdate,returndate))
                        cn.commit()
                        cn.close()
                        showinfo('借阅书籍', '借阅成功!\n注意:30天内免费借阅,超过30天罚款10元,每超过一天增加1元!')

        btok = Button(manfra, text='借阅')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮位置
        ## 触发命令按钮
        btok.config(command=BB)  # 按钮触发

    # 还书
    def Return():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='归还图书')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        Label(manfra, text='输入书号', anchor=E).grid(row=1, column=1)
        Label(manfra, text='还书日期', anchor=E).grid(row=2, column=1)
        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(manfra, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小
        cdate=StringVar()
        txtcdate=Entry(manfra,textvariable=cdate)
        txtcdate.grid(row=2,column=2)

        def RR():
            global cid
            bookid = cno.get()
            realdate = cdate.get()
            cn = connect(dbfile)  # 连接数据库
            cur = cn.execute('select B_state from Books where B_id=?', (bookid,))
            bookstate = cur.fetchall()  # 获取所有记录

            if bookid == '':
                showerror('归还书籍', '书号错误!')
                txtcno.focus()
            else:
                if realdate=='':
                    showerror('归还书籍','日期错误!')
                    txtcdate.focus()
                else:
                    state=[(1,)]
                    if bookstate == state:
                        showerror('借阅书籍', '本书未借出!')
                        txtcno.focus()
                    else:
                        cur = cn.execute('select * from Books where B_id=?', (bookid,))
                        inf = cur.fetchall()
                        Label(manfra, text=inf, anchor=E).grid(row=2, column=2)
                        # 更新书信息
                        realdate = datetime.date(*map(int, realdate.split('-')))

                        cur = cn.execute('select Return_date from Borrow where B_id=?', (bookid,))
                        returndate = cur.fetchall()
                        returndate = datetime.date(*map(int, returndate[0][0].split('-')))

                        if returndate>realdate:
                            realfine=0
                        else:
                            day=(realdate-returndate).days
                            realfine=10+int(day)
                        cn.execute('update Books set B_state=?\
                                        where B_id=?', (1, bookid))
                        cn.execute('update Borrow set Real_date=?,Fine_real=? where B_id=?', (realdate,realfine,bookid))
                        cur=cn.execute('select Fine_all from Fine where R_id=? ',(cid,))
                        inf=cur.fetchall()

                        if len(inf)<=0:
                            cn.execute('insert into Fine(R_id,Fine_all,Fine_yes,Fine_no) values(?,?,?,?)',(cid,realfine,0,realfine))
                        else:
                            infall=int(inf[0][0])+realfine
                            cur = cn.execute('select Fine_no from Fine where R_id=? ', (cid,))
                            inf = cur.fetchall()
                            infno=int(inf[0][0])+realfine
                            cn.execute('update Fine set Fine_all=?,Fine_no=? where R_id=?',(infall,infno,cid))
                        cn.commit()
                        cn.close()
                        showinfo('归还书籍', '还书成功!\n罚款:%s元' %realfine)

        btok = Button(manfra, text='还书')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮位置
        ## 触发命令按钮
        btok.config(command=RR)  # 按钮触发

    # 交罚金
    def Give_Fine():
        global cid
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='提交罚金')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)

        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select Fine_no from Fine where R_id=?', (cid,))
        fm = cur.fetchall()  # 获取所有记录
        txt='应交罚金:%s'%fm[0][0]
        Label(manfra, text=txt, anchor=E).grid(row=1, column=1)

        Label(manfra, text='提交金额', anchor=E).grid(row=2, column=1)
        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(manfra, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=2, column=2)  # 设置单行输入框大小

        def FF():
            global cid
            money = cno.get()
            cur=cn.execute('select Fine_no from Fine where R_id=?', (cid,))
            mno=cur.fetchall()
            mno=mno[0][0]
            mno=int(mno)-int(money)
            cur = cn.execute('select Fine_yes from Fine where R_id=?', (cid,))
            myes = cur.fetchall()
            myes=myes[0][0]
            myes = int(money) + int(myes)
            cn.execute('update Fine set Fine_no=?,Fine_yes=? where R_id=?', (mno,myes,cid))
            cn.commit()
            cn.close()
            showinfo('提交罚金','提交成功!')
            manfra.destroy()

        btok = Button(manfra, text='提交')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮位置
        ## 触发命令按钮
        btok.config(command=FF)  # 按钮触发


    # 读者登录后的菜单
    def Reader_menu():
        menubar = Menu(win)
        win.config(menu=menubar)
        file = Menu(menubar, tearoff=0)
        file.add_command(label='阅览图书',command=Read_Books)
        file.add_command(label='查找图书',command=Fine_Book)
        file.add_separator()  # 添加分隔符
        file.add_command(label='借书',command=Borrow)
        file.add_command(label='还书',command=Return)
        file.add_command(label='借阅信息',command=Read_Borrow)
        file.add_separator()
        file.add_command(label='提交罚款',command=Give_Fine)
        file.add_command(label='欠款信息',command=Read_Fine)
        menubar.add_cascade(label='读者', menu=file)

        backfile = Menu(menubar, tearoff=0)
        backfile.add_command(label='主界面', command=identity)
        menubar.add_cascade(label='退出', menu=backfile)


    # 读者登录注册主界面
    global manfra
    manfra.destroy()
    manfra=LabelFrame(text='读者')
    manfra.pack(anchor='center', pady=150, ipadx=5, ipady=5)
    button_log=Button(manfra,text='登录',height=3,width=20)
    button_log.pack()
    button_sign=Button(manfra,text='注册',height=3,width=20)
    button_sign.pack()
    # 菜单
    menubar = Menu(win)
    win.config(menu=menubar)
    file_back = Menu(menubar, tearoff=0)
    file_back.add_command(label='返回', command=identity)
    menubar.add_cascade(label='主页面', menu=file_back)
    file_signlog=Menu(menubar, tearoff=0)
    file_signlog.add_command(label='读者登录',command=Reader_log)
    file_signlog.add_command(label='读者注册',command=Reader_sign)
    menubar.add_cascade(label='读者', menu=file_signlog)

    # Reader按钮触发
    button_sign.config(command=Reader_sign)
    button_log.config(command=Reader_log)


# 管理员
def Manager():
    # 查找管理员
    def find(key_id):
        cn = connect(dbfile)
        cur = cn.execute('select * from Managers where M_id=?', (key_id,))
        user = cur.fetchall()
        if len(user) > 0:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 匹配管理员者编号和密码
    def match(key_id, key_sec):
        cn = connect(dbfile)
        cur = cn.execute('select M_secret from Managers where M_id=?', (key_id,))
        s = cur.fetchall()
        x = " ".join('%s' % i for i in s)  # s是列表,先转化为字符串再比较
        if x == key_sec:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 阅览管理员
    def Read_Managers():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Managers')
        Mana = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出管理员内容
        if len(Mana) == 0:
            showwarning('管理员管理', '没有管理员!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='管理员信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=50)
            manfra.columnconfigure(2, minsize=80)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=150)
            manfra.columnconfigure(5, minsize=150)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='编号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='姓名',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='电话',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='密码',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Mana:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 查找管理员
    def find_R(key_id):
        cn = connect(dbfile)
        cur = cn.execute('select * from Readers where R_id=?', (key_id,))
        user = cur.fetchall()
        if len(user) > 0:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 编辑读者
    def Edit_Readers():
        ## 设置标签框架manfra
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='编辑读者')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra, text='查找读者')
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入编号', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮大小

        ## 编辑总标签框架
        editframe = LabelFrame(manfra, text='编辑读者')
        editframe.pack(anchor='center', pady=20, ipadx=5, ipady=5)
        ## 删除按钮
        btdel = Button(editframe, text='删除读者', state=DISABLED)
        btdel.pack(anchor=NW)
        ## 修改标签框架
        op = LabelFrame(editframe, text='修改读者')
        op.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        ## 输入修改的新信息
        Label(op, text='新编号', anchor=E).grid(row=1, column=1)  # 新输入提示标签
        newmid = StringVar()  # 定义可以储存输入信息的变量
        newtxtmid = Entry(op, textvariable=newmid)  # 获取输入框的输入信息
        newtxtmid.grid(row=1, column=2)
        Label(op, text='新姓名', anchor=E).grid(row=2, column=1, sticky=E)  # 新输入提示标签
        newmna = StringVar()
        newtxtmna = Entry(op, textvariable=newmna)
        newtxtmna.grid(row=2, column=2)
        Label(op, text='新密码', anchor=E).grid(row=3, column=1, sticky=E)  # 新输入提示标签
        newmse = StringVar()
        newtxtmse = Entry(op, textvariable=newmse)
        newtxtmse.grid(row=3, column=2)
        Label(op, text='新电话', anchor=E).grid(row=4, column=1, sticky=E)  # 新输入提示标签
        newmte = StringVar()
        newtxtmte = Entry(op, textvariable=newmte)
        newtxtmte.grid(row=4, column=2)

        bteditsave = Button(op, text=' 修改', state=DISABLED)  # 确定修改的按钮
        bteditsave.grid(row=1, column=3, rowspan=2, sticky=N + E + S + W)

        ## 判断是否找到
        def dofind():
            cid = cno.get()
            if find_R(cid) == -1:
                showinfo('读者管理', '%s 没有注册!' % cid)
            else:
                # 输出查找到的信息
                cn = connect(dbfile)
                cur = cn.execute('select * from Readers where R_id=?', (cid,))
                inf = cur.fetchall()
                Label(tf, text=inf, anchor=E).grid(row=2,column=2)

                btdel.config(state='normal')  # 让删除按钮btdel处于默认状态
                bteditsave.config(state='normal')  # 修改按钮处于默认状态

        ## 删除
        def dodelete():
            cid = cno.get()  # 获取编号
            if askokcancel('读者管理', "确认删除:%s?" % cid):  # 询问是否进行该操作
                cn = connect(dbfile)  # 连接数据库
                cn.execute('delete from Readers where R_id=?', (cid,))  # 执行删除指令
                cn.commit()
                cn.close()
                showinfo('读者管理', "成功删除:%s" % cid)

        ## 修改
        def saveedit():
            cid = cno.get()  # 获取编号
            newcid=newmid.get() # 新编号
            newname = newmna.get()  # 获新姓名
            newtel=newmte.get()
            if newname == '':
                showerror('读者管理', '新姓名错误:%s' % newname)
                newtxtmna.focus_set()  # 将输入新姓名的框设为焦点。焦点是当前正在操作的控件。
            else:
                if find(newcid) == 1:
                    if cid!=newcid:
                        showerror('读者管理', '编号 %s 已经存在:' % newcid)
                        newtxtmid.focus_set()
                else:
                    newse = newmse.get()  # 获取新密码
                    if newse == '':
                        showerror('读者管理', '密码无效!')
                        newtxtmse.focus_set()
                    else:
                        cn = connect(dbfile)  # 连接数据库
                        cn.execute('update Readers set R_id=?,R_name=?,R_telephone=?,R_secret=?\
                     where R_id=?', (newcid, newname,newtel,newse, cid))  # 更新
                        cn.commit()
                        cn.close()
                        showinfo('读者管理', '修改成功!')

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发
        btdel.config(command=dodelete)  # 删除按钮触发
        bteditsave.config(command=saveedit)  # 修改按钮触发

    # 编辑管理员
    def Edit_Managers():
        ## 设置标签框架manfra
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='编辑管理员')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra, text='查找管理员')
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入编号', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮大小

        ## 编辑总标签框架
        editframe = LabelFrame(manfra, text='编辑管理员')
        editframe.pack(anchor='center', pady=20, ipadx=5, ipady=5)
        ## 删除按钮
        btdel = Button(editframe, text='删除管理员', state=DISABLED)
        btdel.pack(anchor=NW)
        ## 修改标签框架
        op = LabelFrame(editframe, text='修改管理员')
        op.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        ## 输入修改的新信息
        Label(op, text='新编号', anchor=E).grid(row=1, column=1)  # 新输入提示标签
        newmid = StringVar()  # 定义可以储存输入信息的变量
        newtxtmid = Entry(op, textvariable=newmid)  # 获取输入框的输入信息
        newtxtmid.grid(row=1, column=2)
        Label(op, text='新姓名', anchor=E).grid(row=2, column=1, sticky=E)  # 新输入提示标签
        newmna = StringVar()
        newtxtmna = Entry(op, textvariable=newmna)
        newtxtmna.grid(row=2, column=2)
        Label(op, text='新密码', anchor=E).grid(row=3, column=1, sticky=E)  # 新输入提示标签
        newmse = StringVar()
        newtxtmse = Entry(op, textvariable=newmse)
        newtxtmse.grid(row=3, column=2)
        Label(op, text='新电话', anchor=E).grid(row=4, column=1, sticky=E)  # 新输入提示标签
        newmte = StringVar()
        newtxtmte = Entry(op, textvariable=newmte)
        newtxtmte.grid(row=4, column=2)

        bteditsave = Button(op, text=' 修改', state=DISABLED)  # 确定修改的按钮
        bteditsave.grid(row=1, column=3, rowspan=2, sticky=N + E + S + W)

        ## 判断是否找到
        def dofind():
            cid = cno.get()
            if find(cid) == -1:
                showinfo('管理员管理', '%s 没有注册!' % cid)
            else:
                # 输出查找到的信息
                cn = connect(dbfile)
                cur = cn.execute('select * from Managers where M_id=?', (cid,))
                inf = cur.fetchall()
                Label(tf, text=inf, anchor=E).grid(row=2, column=2)

                btdel.config(state='normal')  # 让删除按钮btdel处于默认状态
                bteditsave.config(state='normal')  # 修改按钮处于默认状态

        ## 删除
        def dodelete():
            cid = cno.get()  # 获取编号
            if askokcancel('管理员管理', "确认删除:%s?" % cid):  # 询问是否进行该操作
                cn = connect(dbfile)  # 连接数据库
                cn.execute('delete from Managers where M_id=?', (cid,))  # 执行删除指令
                cn.commit()
                cn.close()
                showinfo('管理员管理', "成功删除:%s" % cid)

        ## 修改
        def saveedit():
            cid = cno.get()  # 获取编号
            newcid = newmid.get()  # 新编号
            newname = newmna.get()  # 获新姓名
            newtel = newmte.get()
            if newname == '':
                showerror('管理员管理', '新姓名错误:%s' % newname)
                newtxtmna.focus_set()  # 将输入新姓名的框设为焦点。焦点是当前正在操作的控件。
            else:
                if find(newcid) == 1:
                    if cid != newcid:
                        showerror('管理员管理', '编号 %s 已经存在:' % newcid)
                        newtxtmid.focus_set()
                else:
                    newse = newmse.get()  # 获取新密码
                    if newse == '':
                        showerror('管理员管理', '密码无效!')
                        newtxtmse.focus_set()
                    else:
                        cn = connect(dbfile)  # 连接数据库
                        cn.execute('update Managers set M_id=?,M_name=?,M_telephone=?,M_secret=?\
                            where M_id=?', (newcid, newname, newtel, newse, cid))  # 更新
                        cn.commit()
                        cn.close()
                        showinfo('管理员管理', '修改成功!')

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发
        btdel.config(command=dodelete)  # 删除按钮触发
        bteditsave.config(command=saveedit)  # 修改按钮触发

    # 阅览读者
    def Read_Readers():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Readers')
        Rea = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Rea) == 0:
            showwarning('读者管理', '没有读者!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='读者信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=50)
            manfra.columnconfigure(2, minsize=80)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=150)
            manfra.columnconfigure(5, minsize=150)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                    font=('微软雅黑', 9, 'normal'), bd=1,
                    relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='编号',
                    font=('微软雅黑', 9, 'normal'), bd=1,
                    relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='姓名',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='密码',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='电话',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Rea:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                        font=('微软雅黑', 9, 'bold'), bd=1,
                        relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                        font=('微软雅黑', 9), bd=1,
                        relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 管理员注册
    def Manager_sign():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='管理员注册')
        manfra.pack(anchor=CENTER, pady=120, ipadx=5, ipady=5)
        ## 输入区域框架
        tf = Frame(manfra)  # 定义放置控件的框架
        tf.pack()
        ## 输入需要添加的编号
        Label(tf, text='编号', anchor=E).grid(row=1, column=1)
        M_id = StringVar()
        txtcno = Entry(tf, textvariable=M_id)
        txtcno.grid(row=1, column=2)
        ## 输入需要添加的姓名
        Label(tf, text='姓名', anchor=E).grid(row=2, column=1)
        M_name = StringVar()
        txtcna = Entry(tf, textvariable=M_name)
        txtcna.grid(row=2, column=2)
        ## 输入需要添加的密码
        Label(tf, text='密码', anchor=E).grid(row=3, column=1)
        M_secret = StringVar()
        txtcnm = Entry(tf, textvariable=M_secret)
        txtcnm.grid(row=3, column=2)
        ## 输入需要添加的电话
        Label(tf, text='电话', anchor=E).grid(row=4, column=1)
        M_telephone = StringVar()
        txtcno = Entry(tf, textvariable=M_telephone)
        txtcno.grid(row=4, column=2)
        ## 管理员注册密匙
        Label(tf, text='注册密匙', anchor=E).grid(row=5, column=1)
        MM = StringVar()
        txtcno = Entry(tf, textvariable=MM)
        txtcno.grid(row=5, column=2)

        # 添加清空按钮区域框架
        tf2 = Frame(manfra)
        tf2.pack()
        btok = Button(tf2, text='确定')  # 确定按钮
        btok.grid(row=1, column=1)
        btclear = Button(tf2, text='清空')  # 清空按钮
        btclear.grid(row=1, column=2)

        # 清空已经输入的
        def clearall():
            M_id.set('')
            M_name.set('')
            M_gender.set('')
            M_telephone.set('')
            MM.set('')

        # 管理员注册
        def savenew():
            cid = M_id.get()
            cna = M_name.get()
            cse =M_secret.get()
            ctel = M_telephone.get()
            cmm=MM.get()
            if cmm=='123':
                if cid == '':
                    showerror('管理员注册', '编号无效!')
                else:
                    if find(cid) == 1:
                        showerror('管理员注册', '编号已经存在!')
                        txtcno.focus()  # 光标集中到户名输入框
                    else:
                        if cna == '':
                            showerror('管理员注册', '名字输入无效!')
                            txtcna.focus()
                        else:
                            if cse=='':
                                showerror('管理员注册','密码无效!')
                            else:
                                cn = connect(dbfile)
                                cn.execute('insert into Managers(M_id,M_name,M_secret,M_telephone) values(?,?,?,?)',
                                           (cid, cna, cse, ctel))
                                cn.commit()
                                cn.close()
                                showinfo('管理员注册', '注册成功!')

                                global manfra
                                manfra.destroy()

                                Manager_menu()
            else:
                showerror('管理员注册','密匙错误')
        # 按钮命令触发
        btclear.config(command=clearall)  # 清空输入框按钮触发
        btok.config(command=savenew)  # 增加读者按钮触发

    # 登录
    def Manage_log():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='管理员登录')
        manfra.pack(anchor=CENTER, pady=120, ipadx=5, ipady=5)
        ## 输入区域框架
        tf = Frame(manfra)  # 定义放置控件的框架
        tf.pack()
        ## 输入编号
        Label(tf, text='编号', anchor=E).grid(row=1, column=1)
        M_id = StringVar()
        txtcno = Entry(tf, textvariable=M_id)
        txtcno.grid(row=1, column=2)
        ## 输入密码
        Label(tf, text='密码', anchor=E).grid(row=2, column=1)
        M_secret = StringVar()
        txtcns = Entry(tf, textvariable=M_secret)
        txtcns.grid(row=2, column=2)

        # 添加按钮区域框架
        tf2 = Frame(manfra)
        tf2.pack()
        btok = Button(tf2, text='确定')  # 确定按钮
        btok.grid(row=1, column=1)
        btclear = Button(tf2, text='清空')  # 清空按钮
        btclear.grid(row=1, column=2)

        # 确定登录后
        def sign_in():
            cid = M_id.get()
            cse = M_secret.get()
            if cid == '':
                showerror('管理员登录', '编号无效!')
                txtcno.focus()
            else:
                if find(cid) < 0:
                    showerror('管理员登录', '编号不存在,请重新输入!')
                    txtcno.focus()
                else:
                    if cse == '':
                        showerror('管理登录', '密码无效!')
                        txtcna.focus()
                    else:
                        if match(cid, cse) < 0:
                            showerror('管理员登录', '密码错误!')
                        else:
                            showinfo('管理员登录', '登录成功!')

                            global manfra
                            manfra.destroy()
                            manfra = LabelFrame(text='亲爱的管理员')
                            manfra.pack(anchor=CENTER, pady=150, ipadx=10, ipady=10)
                            Label(manfra, text='欢迎来到图书馆~', anchor=E).grid(row=1, column=1)

                            Manager_menu()

        # 清空已经输入的
        def clearall():
            M_id.set('')
            M_seccret.set('')

        # 按钮命令触发
        btclear.config(command=clearall)  # 清空输入框按钮触发
        btok.config(command=sign_in)  # 增加读者按钮触发

    # 判断书是否已经存在
    def find_B(key_id):
        cn = connect(dbfile)
        cur = cn.execute('select * from Books where B_id=?', (key_id,))
        user = cur.fetchall()
        if len(user) > 0:
            n = 1
        else:
            n = -1
        cn.close()
        return n

    # 新增图书
    def Add_Book():
        ## 主标签框架
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='新增图书')
        manfra.pack(anchor=CENTER, pady=120, ipadx=5, ipady=5)
        ## 输入区域框架
        tf = Frame(manfra)  # 定义放置控件的框架
        tf.pack()
        ## 输入需要添加
        Label(tf, text='编号', anchor=E).grid(row=1, column=1)
        cno = StringVar()
        txtcno = Entry(tf, textvariable=cno)
        txtcno.grid(row=1, column=2)
        ## 输入需要添加
        Label(tf, text='书名', anchor=E).grid(row=2, column=1, sticky=E)
        cname = StringVar()
        txtcna = Entry(tf, textvariable=cname)
        txtcna.grid(row=2, column=2)
        ## 输入需要添加
        Label(tf, text='作者', anchor=E).grid(row=3, column=1, sticky=E)
        cwrite = StringVar()
        txtcwr = Entry(tf, textvariable=cwrite)
        txtcwr.grid(row=3, column=2)
        ## 输入需要添加
        Label(tf, text='出版社', anchor=E).grid(row=4, column=1, sticky=E)
        cpub = StringVar()
        txtcpub = Entry(tf, textvariable=cpub)
        txtcpub.grid(row=4, column=2)
        ## 输入需要添加
        Label(tf, text='类别', anchor=E).grid(row=5, column=1, sticky=E)
        ccla = StringVar()
        txtccla = Entry(tf, textvariable=ccla)
        txtccla.grid(row=5, column=2)

        # 添加清空按钮区域框架
        tf2 = Frame(manfra)
        tf2.pack()
        btok = Button(tf2, text='添加')  # 添加按钮
        btok.grid(row=1, column=1)
        btclear = Button(tf2, text='清空')  # 清空按钮
        btclear.grid(row=1, column=2)

        # 清空已经输入的
        def clearall():
            cno.set('')
            cname.set('')
            cwrite.set('')
            cpub.set('')
            ccla.set('')

        # 添加
        def savenew():
            cid = cno.get()
            cna = cname.get()
            cwr=cwrite.get()
            cpu=cpub.get()
            ccl=ccla.get()
            if cid == '':
                showerror('图书管理', '编号无效!')
            else:
                if find_B(cid) == 1:
                    showerror('图书管理', '编号已经存在!')
                    txtcno.focus()  # 光标集中到户名输入框
                else:
                    if cna == '':
                        showerror('图书管理', '书名输入无效!')
                        txtcna.focus()
                    else:
                        cn = connect(dbfile)
                        t=1
                        cn.execute('insert into Books(B_id,B_name,\
                        B_writer,B_publishing,B_classify,B_state) \
                        values(?,?,?,?,?,?)', (cid, cna,cwr,cpu,ccl,t))
                        cn.commit()
                        cn.close()
                        showinfo('图书管理', '已成功添加新书!')

        # 按钮命令触发
        btclear.config(command=clearall)  # 清空输入框按钮触发
        btok.config(command=savenew)  # 增加客户按钮触发

        # 阅览图书

    # 阅览图书
    def Read_Books():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Books')
        Bo = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Bo) == 0:
            showwarning('书籍管理', '没有书籍!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='图书信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=50)
            manfra.columnconfigure(2, minsize=70)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=80)
            manfra.columnconfigure(5, minsize=100)
            manfra.columnconfigure(6, minsize=80)
            manfra.columnconfigure(7, minsize=50)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                    font=('微软雅黑', 9, 'normal'), bd=1,
                    relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='编号',
                    font=('微软雅黑', 9, 'normal'), bd=1,
                    relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='书名',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='作者',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='出版社',
                    font=('微软雅黑', 9), bd=1,
                    relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
            Label(manfra, text='类别',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
            Label(manfra, text='状态',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Bo:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                        font=('微软雅黑', 9, 'bold'), bd=1,
                        relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                            font=('微软雅黑', 9), bd=1,
                            relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 编辑图书
    def Edit_Book():
        ## 设置标签框架manfra
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='编辑图书')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra, text='查找图书')
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入编号', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮大小

        ## 编辑总标签框架
        editframe = LabelFrame(manfra, text='编辑图书')
        editframe.pack(anchor='center', pady=20, ipadx=5, ipady=5)
        ## 删除按钮
        btdel = Button(editframe, text='删除图书', state=DISABLED)
        btdel.pack(anchor=NW)
        ## 修改标签框架
        op = LabelFrame(editframe, text='修改图书')
        op.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        ## 输入修改的新信息
        Label(op, text='新编号', anchor=E).grid(row=1, column=1)  # 新输入提示标签
        newid = StringVar()  # 定义可以储存输入信息的变量
        newtxtid = Entry(op, textvariable=newid)  # 获取输入框的输入信息
        newtxtid.grid(row=1, column=2)
        Label(op, text='新书名', anchor=E).grid(row=2, column=1, sticky=E)  # 新输入提示标签
        newna = StringVar()
        newtxtna = Entry(op, textvariable=newna)
        newtxtna.grid(row=2, column=2)
        Label(op, text='新作者', anchor=E).grid(row=3, column=1, sticky=E)  # 新输入提示标签
        newwr = StringVar()
        newtxtwr = Entry(op, textvariable=newwr)
        newtxtwr.grid(row=3, column=2)
        Label(op, text='新出版社', anchor=E).grid(row=4, column=1, sticky=E)  # 新输入提示标签
        newpu = StringVar()
        newtxtpu = Entry(op, textvariable=newpu)
        newtxtpu.grid(row=4, column=2)
        Label(op, text='新类别', anchor=E).grid(row=5, column=1, sticky=E)  # 新输入提示标签
        newcl = StringVar()
        newtxtcl = Entry(op, textvariable=newcl)
        newtxtcl.grid(row=5, column=2)
        Label(op, text='新状态', anchor=E).grid(row=6, column=1, sticky=E)  # 新输入提示标签
        newst = StringVar()
        newtxtst = Entry(op, textvariable=newst)
        newtxtst.grid(row=6, column=2)

        bteditsave = Button(op, text=' 修改', state=DISABLED)  # 确定修改的按钮
        bteditsave.grid(row=1, column=3, rowspan=2, sticky=N + E + S + W)

        ## 判断是否找到
        def dofind():
            cid = cno.get()
            if find_B(cid) == -1:
                showinfo('图书管理', '%s 没有注册!' % cid)
            else:
                # 输出查找到的信息
                cn = connect(dbfile)
                cur = cn.execute('select * from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                Label(tf, text=inf, anchor=E).grid(row=2, column=2)

                cur = cn.execute('select B_id from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtid.insert(0,inf)
                cur = cn.execute('select B_name from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtna.insert(0, inf)
                cur = cn.execute('select B_writer from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtwr.insert(0, inf)
                cur = cn.execute('select B_publishing from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtpu.insert(0, inf)
                cur = cn.execute('select B_classify from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtcl.insert(0, inf)
                cur = cn.execute('select B_state from Books where B_id=?', (cid,))
                inf = cur.fetchall()
                newtxtst.insert(0, inf)
                cn.commit()
                cn.close()

                btdel.config(state='normal')  # 让删除按钮btdel处于默认状态
                bteditsave.config(state='normal')  # 修改按钮处于默认状态

        ## 删除
        def dodelete():
            cid = cno.get()  # 获取编号
            if askokcancel('图书管理', "确认删除:%s?" % cid):  # 询问是否进行该操作
                cn = connect(dbfile)  # 连接数据库
                cn.execute('delete from Books where B_id=?', (cid,))  # 执行删除指令
                cn.commit()
                cn.close()
                showinfo('图书管理', "成功删除:%s" % cid)

        ## 修改
        def saveedit():
            cid = cno.get()  # 获取编号
            newcid = newid.get()  # 新编号
            newname = newna.get()
            newwriter = newwr.get()
            newpublish=newpu.get()
            newclassify=newcl.get()
            newstate=newst.get()

            if newname == '':
                showerror('图书管理', '新书名错误:%s' % newname)
                newtxtna.focus_set()  # 将输入新姓名的框设为焦点。焦点是当前正在操作的控件。
            else:
                if find_B(newcid) == 1:
                    if cid != newcid:
                        showerror('图书管理', '编号 %s 已经存在:' % newcid)
                        newtxtid.focus_set()
                    else:
                        if newstate !='0' and newstate!='1':
                            showerror('图书管理', '状态无效!')
                            newtxtst.focus_set()
                        else:
                            cn = connect(dbfile)  # 连接数据库
                            cn.execute('update Books set B_id=?,B_name=?,B_writer=?,B_publishing=?,B_classify=?,B_state=? \
                            where B_id=?',(newcid, newname, newwriter, newpublish, newclassify,newstate,cid))  # 更新
                            cn.commit()
                            cn.close()
                            showinfo('图书管理', '修改成功!')

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发
        btdel.config(command=dodelete)  # 删除按钮触发
        bteditsave.config(command=saveedit)  # 修改按钮触发

    # 查找书
    def Find_Book():
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='查找图书')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra)
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入书名', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        def dofind():
            bookname = cno.get()
            if bookname=='':
                showerror('查找图书','书名无效!')
            else:
                cn = connect(dbfile)
                cur = cn.execute('select * from Books where B_name=?', (bookname,))
                inf = cur.fetchall()
                if len(inf)<=0:
                    showerror('查找图书','查无此书!')
                else:
                    global manfra
                    manfra.destroy()
                    ## 设置表格大小、位置
                    manfra = LabelFrame(text='查询结果')  # 标签框架
                    manfra.pack(anchor='center', pady=20, ipadx=5, ipady=5)  # 标签框架摆放位置
                    # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
                    manfra.columnconfigure(1, minsize=50)
                    manfra.columnconfigure(2, minsize=70)
                    manfra.columnconfigure(3, minsize=100)
                    manfra.columnconfigure(4, minsize=80)
                    manfra.columnconfigure(5, minsize=100)
                    manfra.columnconfigure(6, minsize=80)
                    manfra.columnconfigure(7, minsize=50)
                    # 在标签框架里创建标签,sticky是对齐方法
                    Label(manfra, text='序号',
                          font=('微软雅黑', 9, 'normal'), bd=1,
                          relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
                    Label(manfra, text='编号',
                          font=('微软雅黑', 9, 'normal'), bd=1,
                          relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
                    Label(manfra, text='书名',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
                    Label(manfra, text='作者',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
                    Label(manfra, text='出版社',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
                    Label(manfra, text='类别',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
                    Label(manfra, text='状态',
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

                    rn = 2  # 记录行
                    for x in inf:  # 循环每行
                        cn = 1  # 记录列
                        Label(manfra, text=str(rn - 1),
                              font=('微软雅黑', 9, 'bold'), bd=1,
                              relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                        for a in x:  # 循环每列
                            cn += 1
                            Label(manfra, text=str(a),
                                  font=('微软雅黑', 9), bd=1,
                                  relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                        rn += 1

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮位置

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发

    # 阅览欠款信息
    def Read_Fine():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Fine')
        Rea = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Rea) == 0:
            showwarning('欠款管理', '暂无欠款信息!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='欠款信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=30)
            manfra.columnconfigure(2, minsize=50)
            manfra.columnconfigure(3, minsize=100)
            manfra.columnconfigure(4, minsize=100)
            manfra.columnconfigure(5, minsize=100)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='读者编号',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='总罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='已交罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='未交罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Rea:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 阅览借阅信息
    def Read_Borrow():
        global manfra  # 标签的父级对象,本函数中就是该标签放置的位置(标签框架)
        cn = connect(dbfile)  # 连接数据库
        cur = cn.execute('select * from Borrow')
        Rea = cur.fetchall()  # 获取所有记录
        cn.close()  # 关闭数据库
        manfra.destroy()  # 需要销毁控件时触发

        ## 开始输出读者信息
        if len(Rea) == 0:
            showwarning('借阅管理', '暂无借阅信息!')  # 警告信息
        else:
            ## 设置表格大小、位置
            manfra = LabelFrame(text='借阅信息')  # 标签框架
            manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)  # 标签框架摆放位置
            # 改变表格框的尺寸columnconfigure(表格框的列,weight=缩放权重,minsuze=最小宽度)
            manfra.columnconfigure(1, minsize=30)
            manfra.columnconfigure(2, minsize=50)
            manfra.columnconfigure(3, minsize=50)
            manfra.columnconfigure(4, minsize=100)
            manfra.columnconfigure(5, minsize=100)
            manfra.columnconfigure(6, minsize=100)
            manfra.columnconfigure(7, minsize=80)
            # 在标签框架里创建标签,sticky是对齐方法
            Label(manfra, text='序号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=1, sticky=N + E + S + W)
            Label(manfra, text='书籍编号',
                  font=('微软雅黑', 9, 'normal'), bd=1,
                  relief=SOLID).grid(row=1, column=2, sticky=N + E + S + W)
            Label(manfra, text='读者编号',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=3, sticky=N + E + S + W)
            Label(manfra, text='借阅日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=4, sticky=N + E + S + W)
            Label(manfra, text='应还日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=5, sticky=N + E + S + W)
            Label(manfra, text='实际归还日期',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=6, sticky=N + E + S + W)
            Label(manfra, text='罚款',
                  font=('微软雅黑', 9), bd=1,
                  relief=SOLID).grid(row=1, column=7, sticky=N + E + S + W)

            rn = 2  # 记录行
            for x in Rea:  # 循环每行
                cn = 1  # 记录列
                Label(manfra, text=str(rn - 1),
                      font=('微软雅黑', 9, 'bold'), bd=1,
                      relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                for a in x:  # 循环每列
                    cn += 1
                    Label(manfra, text=str(a),
                          font=('微软雅黑', 9), bd=1,
                          relief=SOLID).grid(row=rn, column=cn, sticky=N + E + S + W)
                rn += 1

    # 编辑欠款信息
    def Edit_Fine():
        ## 设置标签框架manfra
        global manfra
        manfra.destroy()
        manfra = LabelFrame(text='编辑欠款')
        manfra.pack(anchor='center', pady=50, ipadx=5, ipady=5)
        ## 把标签框架manfra细分,即在manfra中再设置标签框架
        tf = LabelFrame(manfra, text='查找欠款信息')
        tf.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        Label(tf, text='输入读者编号', anchor=E).grid(row=1, column=1)

        cno = StringVar()  # 能自动刷新的字符串变量,能获取文本框中输入的值
        txtcno = Entry(tf, textvariable=cno)  # 定义单行输入框
        txtcno.grid(row=1, column=2)  # 设置单行输入框大小

        btok = Button(tf, text='查找')  # 定义按钮
        btok.grid(row=1, column=3)  # 设置按钮大小

        ## 编辑总标签框架
        editframe = LabelFrame(manfra, text='编辑欠款')
        editframe.pack(anchor='center', pady=20, ipadx=5, ipady=5)
        ## 删除按钮
        btdel = Button(editframe, text='删除欠款', state=DISABLED)
        btdel.pack(anchor=NW)
        ## 修改标签框架
        op = LabelFrame(editframe, text='更新欠款')
        op.pack(anchor='center', pady=10, ipadx=5, ipady=5)
        ## 输入修改的新信息
        Label(op, text='总罚金', anchor=E).grid(row=1, column=1)  # 新输入提示标签
        newall = StringVar()  # 定义可以储存输入信息的变量
        newtxtall = Entry(op, textvariable=newall)  # 获取输入框的输入信息
        newtxtall.grid(row=1, column=2)
        Label(op, text='已交罚金', anchor=E).grid(row=2, column=1, sticky=E)  # 新输入提示标签
        newyes = StringVar()
        newtxtyes = Entry(op, textvariable=newyes)
        newtxtyes.grid(row=2, column=2)
        Label(op, text='未交罚金', anchor=E).grid(row=3, column=1, sticky=E)  # 新输入提示标签
        newno = StringVar()
        newtxtno = Entry(op, textvariable=newno)
        newtxtno.grid(row=3, column=2)

        bteditsave = Button(op, text='修改', state=DISABLED)  # 确定修改的按钮
        bteditsave.grid(row=1, column=3, rowspan=2, sticky=N + E + S + W)

        def find_F(key):
            cn = connect(dbfile)
            cur = cn.execute('select * from Fine where R_id=?', (key,))
            user = cur.fetchall()
            if len(user) > 0:
                n = 1
            else:
                n = -1
            cn.close()
            return n

        ## 判断是否找到
        def dofind():
            cid = cno.get()
            if find_F(cid) == -1:
                showinfo('欠款管理', '%s 没有该条欠款!' % cid)
            else:
                # 输出查找到的信息
                cn = connect(dbfile)
                cur = cn.execute('select * from Fine where R_id=?', (cid,))
                inf = cur.fetchall()
                Label(tf, text=inf, anchor=E).grid(row=2, column=2)

                cur = cn.execute('select Fine_all from Fine where R_id=?', (cid,))
                inf = cur.fetchall()
                newtxtall.insert(0, inf)
                cur = cn.execute('select Fine_yes from Fine where R_id=?', (cid,))
                inf = cur.fetchall()
                newtxtyes.insert(0, inf)
                cur = cn.execute('select Fine_no from Fine where R_id=?', (cid,))
                inf = cur.fetchall()
                newtxtno.insert(0, inf)
                cn.commit()
                cn.close()

                btdel.config(state='normal')  # 让删除按钮btdel处于默认状态
                bteditsave.config(state='normal')  # 修改按钮处于默认状态

        ## 删除
        def dodelete():
            cid = cno.get()  # 获取编号
            if askokcancel('欠款管理', "确认删除:%s?" % cid):  # 询问是否进行该操作
                cn = connect(dbfile)  # 连接数据库
                cn.execute('delete from Fine where R_id=?', (cid,))  # 执行删除指令
                cn.commit()
                cn.close()
                showinfo('欠款管理', "成功删除:%s" % cid)

        ## 修改
        def saveedit():
            cid = cno.get()  # 获取编号
            newal = newall.get()
            newye = newyes.get()
            newnoo = newno.get()

            if newal == '' or newye=='' or newnoo=='':
                showerror('欠款管理', '罚金错误!')
            else:
                cn = connect(dbfile)  # 连接数据库
                cn.execute('update Fine set R_id=?,Fine_all=?,Fine_yes=?,Fine_no=? \
                            where R_id=?',
                            (cid, newal, newye, newnoo, cid))  # 更新
                cn.commit()
                cn.close()
                showinfo('欠款管理', '更新成功!')

        ## 触发命令按钮
        btok.config(command=dofind)  # 查找按钮触发
        btdel.config(command=dodelete)  # 删除按钮触发
        bteditsave.config(command=saveedit)  # 修改按钮触发

    # 管理员登录后的菜单
    def Manager_menu():
        menubar = Menu(win)
        win.config(menu=menubar)
        file_M = Menu(menubar, tearoff=0)
        file_M.add_command(label='阅览管理员', command=Read_Managers)
        file_M.add_command(label='编辑管理员', command=Edit_Managers)
        menubar.add_cascade(label='管理员管理', menu=file_M)

        file_R = Menu(menubar, tearoff=0)
        file_R.add_command(label='阅览读者', command=Read_Readers)
        file_R.add_command(label='编辑和查找读者', command=Edit_Readers)
        menubar.add_cascade(label='读者管理', menu=file_R)

        file_B = Menu(menubar, tearoff=0)
        file_B.add_command(label='阅览图书', command=Read_Books)
        file_B.add_command(label='新增图书', command=Add_Book)
        file_B.add_command(label='编辑图书',command=Edit_Book)
        file_B.add_command(label='查找图书',command=Find_Book)
        menubar.add_cascade(label='图书管理', menu=file_B)

        file_F = Menu(menubar, tearoff=0)
        file_F.add_command(label='借阅信息',command=Read_Borrow)
        file_F.add_separator()
        file_F.add_command(label='阅览欠款信息',command=Read_Fine)
        file_F.add_command(label='编辑欠款信息',command=Edit_Fine)
        menubar.add_cascade(label='借阅管理', menu=file_F)

        file = Menu(menubar, tearoff=0)
        file.add_command(label='退出', command=identity)
        menubar.add_cascade(label='主界面', menu=file)


    # 管理员登录注册主界面
    global manfra
    manfra.destroy()
    manfra = LabelFrame(text='管理员')
    manfra.pack(anchor='center', pady=150, ipadx=5, ipady=5)
    button_log = Button(manfra, text='登录', height=3, width=20)
    button_log.pack()
    button_sign = Button(manfra, text='注册', height=3, width=20)
    button_sign.pack()
    # 菜单
    menubar = Menu(win)
    win.config(menu=menubar)
    file_back = Menu(menubar, tearoff=0)
    file_back.add_command(label='返回', command=identity)
    menubar.add_cascade(label='主页面', menu=file_back)
    file_signlog = Menu(menubar, tearoff=0)
    file_signlog.add_command(label='管理员登录', command=Manage_log)
    file_signlog.add_command(label='管理员注册', command=Manager_sign)
    menubar.add_cascade(label='管理员', menu=file_signlog)

    # Reader按钮触发
    button_sign.config(command=Manager_sign)
    button_log.config(command=Manage_log)


def identity():
    menubar = Menu(win)
    win.config(menu=menubar)
    file_back = Menu(menubar, tearoff=0)
    # file_back.add_command(label='返回', command=identity)
    # menubar.add_cascade(label='主页面', menu=file_back)
    global manfra
    # 按钮选择是管理员还是读者
    manfra.destroy()
    manfra=LabelFrame(text='身份选择')
    manfra.pack(anchor='center', pady=150, ipadx=5, ipady=5)
    button_M=Button(manfra,text='管理员',height=3,width=20)
    button_M.pack()
    button_R=Button(manfra,text='读者',height=3,width=20)
    button_R.pack()

    button_R.config(command=Reader)
    button_M.config(command=Manager)


# 主函数
back_main()
identity()
win.mainloop()

六 运行截图

【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现
【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现
【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现文章来源地址https://www.toymoban.com/news/detail-495808.html

到了这里,关于【数据库课设】图书馆资源管理系统 源码+流程图+结构设计(借还图书 逾期罚款 图书管理 读者管理 信息查询)python实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据库课程设计-图书馆管理系统(3. 用户软件,基于QT)

    如果对你有帮助,可以给卑微的博主留个赞、关注、收藏   (不是)  (骗一下数据,说不定以后面试就过了,拜谢) 用户软件的实现根据自己所用语言选择对应开发工具,c++ 较常用的是QT或者MFC。这里使用QT做个示例,但博主前端属实现学现卖,也就是能用级别,可以参考一下

    2024年02月09日
    浏览(47)
  • 图书馆管理系统【GUI/Swing+MySQL】(Java课设)

    Swing窗口类型+Mysql数据库存储数据 适合作为Java课设!!! jdk1.8+Mysql8.0+Idea或eclipse+jdbc  本系统源码地址:https://download.csdn.net/download/qq_50954361/87682509 更多Java课设系统:更多Java课设系统 更多Java课设系统运行效果展示:更多Java课设系统运行效果展示  部署教程地址:Java课设部

    2023年04月19日
    浏览(45)
  • python爬虫分析基于python图书馆书目推荐数据分析与可视化

    收藏关注不迷路 随着电子技术的普及和快速发展,线上管理系统被广泛的使用,有很多商业机构都在实现电子信息化管理,图书推荐也不例外,由比较传统的人工管理转向了电子化、信息化、系统化的管理。 传统的图书推荐管理,一开始都是手工记录,然后将手工记录的文

    2024年02月08日
    浏览(42)
  • vue图书馆书目推荐数据分析与可视化-计算机毕业设计python-django-php

    建立本图书馆书目推荐数据分析是为了通过系统对图书数据根据算法进行的分析好推荐,以方便用户对自己所需图书信息的查询,根据不同的算法机制推荐给不同用户不同的图书,用户便可以从系统中获得图书信息信息。 对用户相关数据进行分析,为相似度较高的用户建立邻

    2024年02月06日
    浏览(44)
  • 实战 图书馆系统管理案例

    config :敏感的配置一般都是在配置中心配置,比如consul或者阿波罗上面 controller :写一些handler的,拿到参数要去调用service层的逻辑。( 只负责接受参数,怎么绑定参数,要去调用哪个service的,handler的一个入口 ) service: service层才是正真的业务处理层 。调用dao层的增删改

    2024年02月11日
    浏览(45)
  • 区块链在图书馆中应用

      附件:选做源文件 区块链技术在图书馆中应用 哈尔滨工程大学 区块链技术课程         计算机学院 2019065316 王蕊  前 言:区块链成为技术应用的研究热点,并作为战略前沿技术被写入国家信息化规划[1],区块链的应用也从金融行业向图书馆等其他行业渗透。目前,区块

    2024年01月21日
    浏览(36)
  • Java 实现图书馆管理系统

    目录 一:创建对象 1.学生类对象Student : 2.图书类对象book : 3.管理员类对象OP: 二.创建主要交互界面MainMenu,并实现主界面功能 1.创建交互界面: 2.实现主界面功能: 三:创建OP管理界面: 1.创建主要交互界面及实现\\\"管理学生\\\"功能OPmenu: (1).交互界面: (2):实现\\\"管理学生\\\"功能: 2.实现\\\"管理

    2024年02月12日
    浏览(44)
  • 安卓期末大作业-图书馆借书系统、图书借阅app(附下载链接)

    安卓期末大作业,图书借阅APP,老师给了95分,可以注册登录,借阅书籍,还书,含数据库存储借书记录,导入AndroidStudio即可使用,代码注释详细 点我下载项目源码 进入APP界面: 注册登录界面如下所示: 登录界面: 注册部分代码: @Override protected void onStop() { super.onStop();

    2024年02月03日
    浏览(57)
  • Android Studio实现图书馆订座系统

    在校园生活中,图书馆是很多人选择的学习圣地,这里不仅充满书香气息,而且还十分静谧。这样的学习环境,必然会很抢手,导致很多学生早早就来图书馆占座,渐渐地因为一直占不到座的同学就失去了学习的动力。 针对这样的实际问题,我们设计了一款图书馆订座系统。

    2024年02月06日
    浏览(79)
  • C++图书馆管理系统(简单版)

    实用的图书馆管理系统应该至少包括一下功能: 1、上传:新进图书以及基本信息的输入 2、删除:旧图书以及基本信息的删除 3、显示:显示图书馆已有的所有图书 4、查找:查询要借阅的图书信息 5、借阅:实现用户办理借阅手续 6、归还:实现用户办理归还手续 系统以菜单

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包