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

news2024/11/19 17:43:10

文章目录

  • 一 实现功能
    • (1)管理员功能
    • (2)读者功能
  • 二 数据流图
  • 三 概念结构设计
  • 四 文件目录
  • 五 源码:main.py
  • 六 运行截图

一 实现功能

(1)管理员功能

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

(2)读者功能

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

二 数据流图

在这里插入图片描述

三 概念结构设计

在这里插入图片描述

四 文件目录

在这里插入图片描述

五 源码: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()

六 运行截图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/669784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis—安装以及可视化

前言 redis 是一种非关系型数据库&#xff0c;什么是非关系型数据库&#xff0c;之前我们在mysql专栏 也有提到过&#xff0c;这边就不再过多的赘述&#xff0c;忘记了的小伙伴可以再次阅读这篇文章 终于明白了数据库的【关系型】与【非关系型】 其实这还是挺重要的&#xff…

ruoyi+vue回显数字的问题,解决方案

在项目中用ruoyi框架和前端vue进行开发&#xff0c; 需求是在前端生成下拉框&#xff0c;下拉框中的内容需要调用后端接口进行数据返回&#xff0c; 现在新增的时候&#xff0c;数据已经返回了&#xff0c;但是再修改的时候&#xff0c;进行回显数据导致前端列表中展示出来的…

城市排水监测系统为城市排水防涝提质增效

城市化进程中&#xff0c;城市排水系统成为城市基础设施建设的重要组成部分。然而&#xff0c;随着气候变化和城市建设规模的扩大&#xff0c;极端天气和内涝风险不断增加&#xff0c;城市的排水系统面临巨大挑战。因此&#xff0c;建立一套智能化城市排水监测系统&#xff0c;…

【python】一些常用的pandas技巧

有了gpt之后&#xff0c;确实很多代码都可以让gpt给改错。嘎嘎香 merge多个dateframe https://stackoverflow.com/questions/44327999/how-to-merge-multiple-dataframes data_net [a,b,c,d] net_merged reduce(lambda left,right: pd.merge(left,right,on[key column],ho…

小程序安全指南:保护用户数据的最佳实践

第一章&#xff1a;引言 近年来&#xff0c;小程序已成为移动应用开发的重要组成部分。它们为用户提供了方便的功能和个性化的体验&#xff0c;然而&#xff0c;与此同时&#xff0c;小程序安全问题也引起了广泛的关注。保护用户数据是开发者应该高度重视的问题。在本指南中&a…

JavaScript ES11新特性

文章目录 导文可选链操作符&#xff08;Optional Chaining Operator&#xff09;空值合并操作符&#xff08;Nullish Coalescing Operator&#xff09;动态 import() 函数BigInt 类型Promise.allSettled() 导文 JavaScript ES11&#xff0c;也被称为ES2020&#xff0c;引入了一…

经纬度、时差知识整理(理解与应用)

经纬度是经度与纬度的合称组成一个坐标系统&#xff0c;称为地理坐标系统&#xff0c;它是一种利用三度空间的球面来定义地球上的空间的球面坐标系统&#xff0c;能够标示地球上的任何一个位置。初一的同学在学地理这门课的时候&#xff0c;一上来很快就会学到经纬度这个概念。…

PC市场寒冬,大众还需要PC吗?

PC市场寒冬&#xff0c;大众还需要PC吗&#xff1f; PC&#xff08;个人电脑&#xff09;市场从2016年智能手机兴起之时便进入下滑态势&#xff0c;到2020年疫情发生后&#xff0c;居家办公、在线教育等需求曾给PC市场带来连续六个季度的增长。⁴ 好景不长&#xff0c;进入202…

mybatisplus分页total总数为0

mybatisplus分页total总数为0 背景&#xff1a;最近初始化新项目时&#xff0c;使用mybatisplus分页功能发现 records 有记录&#xff0c;但是 total 总是为0&#xff0c;于是开启了一顿“知识寻求”之路SpringBoot版本 <parent><groupId>org.springframework.boo…

Makerbase CANable V2.0 固件升级或替换

第1部分 应用软件与固件 应用软件CANable V2.0CANable V1.0cangaroocandleLight/slcan(支持CAN FD)candleLight/slcan/cantactBUSMASTER V3.2.2candleLightcandleLight/pcan/cantactTSMastercandleLightcandleLight/pcan/cantactPCAN-Explorer 5、pcan view不支持pcancantacts…

一文带你全面理解 MySQL 中的常用函数

0️⃣前言 MySQL是一种常用的关系型数据库管理系统&#xff0c;它提供了许多内置函数来处理数据。本文将介绍MySQL中的各种常用函数&#xff0c;包括字符串函数、日期函数、数学函数、聚合函数等。 文章目录 0️⃣前言1️⃣字符串函数1.1CONCAT函数1.2SUBSTRING函数1.3REPLACE函…

建设一个网站需要多长时间?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言网站建设的基本步骤…

【Leetcode60天带刷】day10栈与队列—— 232.用栈实现队列,225. 用队列实现栈

题目&#xff1a; 232. 用栈实现队列 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移…

Spring Boot 集成 Redisson分布式锁

Redisson 是一种基于 Redis 的 Java 驻留集群的分布式对象和服务库&#xff0c;可以为我们提供丰富的分布式锁和线程安全集合的实现。在 Spring Boot 应用程序中使用 Redisson 可以方便地实现分布式应用程序的某些方面&#xff0c;例如分布式锁、分布式集合、分布式事件发布和订…

旷视研究院获 CVPR 2023 自动驾驶国际挑战赛 OpenLane Topology 赛道冠军

近日&#xff0c;为期三个月的 CVPR 2023 自动驾驶国际挑战赛比赛结果揭晓。旷视研究院在OpenLane Topology 赛道中击败 30 余支国内外队伍&#xff0c;夺得冠军。 自动驾驶技术已经渗透到人们的日常生活中&#xff0c;但是传统的感知方法仍不能满足大家对 L5 级自动驾驶的追逐…

傻瓜式教程--基于FPGA的CYUSB3014双向通信

一、概述 CYUSB3014是赛普拉斯在近几年推出的新一代USB3.0的外设控制器&#xff0c;可以解决USB2.0带宽限制&#xff0c;或者单独开发USB协议和驱动的难题。赛普拉斯将CYUSB3014简称为EZ-USB FX3&#xff0c;具有高度的灵活特性&#xff0c;开发人员只需要下载FX3的固件库&…

电脑死机怎么办?试试这5个方法!

案例&#xff1a;我的电脑用着用着突然死机了&#xff0c;我的文档写到了一半没有保存&#xff0c;不知道还能不能找回&#xff1f;电脑死机了怎么办&#xff1f;有没有小伙伴有应对的方法&#xff1f; 随着电脑在我们生活中的普及和广泛应用&#xff0c;电脑死机问题也成为了…

【Python】让 plotly 可视化更上一层:cufflinks 包

文章目录 一、导读二、安装三、使用方法四、数据说明五、折线图六、散点图七、气泡图八、柱状图九、箱型图box十、直方图十一、小提琴图十二、热力图heatmap十三、3d图十四、散点矩阵图十五、子图 一、导读 今天给大家推荐一个高级的可视化神器&#xff1a;cufflinks 学习过可…

智能汽车 | 为什么是高压,为什么800V?

摘要&#xff1a; 在谈到高压储能以及高压动力电池时候&#xff0c;有提到400V的&#xff0c;800V的&#xff0c;还有光伏储能用的1500V的&#xff1b;为什么是高压&#xff1f;本文做个总结。 1、李想看高压系统架构 今春李想的发言&#xff0c;从用户需求&#xff0c;市场需…

vue elementUI封装的无限多级导航菜单(递归循环)

需要封装成两个文件&#xff1a; menu/index.vue <template><el-menuclass"box-card"unique-opened:collapse"$store.state.isCollapse":default-active"$store.state.nowPage"background-color"#2f3332"text-color"…