精华内容
下载资源
问答
  • 开发语言:Python | 大小:19.05M | 发布时间:2019-05-27 | 发布人:李易峰相关标签:立即下载开发语言:Python | 大小:0.21M | 发布时间:2020-08-23 | 发布人:聂嘉辉相关标签:立即下载开发语言:Python | 大小...

    开发语言:Python | 大小:19.05M | 发布时间:2019-05-27 | 发布人:李易峰

    相关标签:

    立即下载

    开发语言:Python | 大小:0.21M | 发布时间:2020-08-23 | 发布人:聂嘉辉

    相关标签:

    立即下载

    开发语言:Python | 大小:0.02M | 发布时间:2020-07-11 |

    立即下载

    开发语言:Python | 大小:1.07M | 发布时间:2019-02-04 |

    立即下载

    开发语言:Python | 大小:0.02M | 发布时间:2016-07-07 | 发布人:linq

    相关标签:

    立即下载

    开发语言:Python | 大小:5.15KB | 发布时间:2020-07-30 |

    立即下载

    开发语言:Python | 大小:22.36M | 发布时间:2019-11-06 |

    立即下载

    开发语言:Python | 大小:5.45KB | 发布时间:2018-04-04 | 发布人:三块七

    相关标签:

    立即下载

    开发语言:Python | 大小:6.39KB | 发布时间:2018-11-27 |

    立即下载

    开发语言:Python | 大小:2.22M | 发布时间:2020-10-12 |

    立即下载

    展开全文
  • 设计一个GUI界面的系统,模拟图书管理,一个面向学生和学校管理员的系统,图书信息以txt文件存在本地。 管理员:查询图书 增加图书 删除图书 学生:借阅图书 归还图书 任何一个操作都会将所更新的图书...
  • 图书管理系统GUI+数据库
  • 入门级别的图书管理系统,有数据库文件,有简单界面,可以实现图书信息的增加、修改、删除和查看,很简单,有两个主要界面
  • Python实现带GUI和连接数据库的图书管理系统

    千次阅读 多人点赞 2020-12-04 17:51:01
    文章目录前言二、建立数据库library2.1 book表2.2 borrow表2.3 user表三、各个... 前言 大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的《图书管理系统》来写。用python写是因为py有自带的GUI,即tkint


    前言

    作者注:这是一个稚嫩青涩的项目,由于赶时间且自身技术不成熟,所以仅实现了基础功能且只能本地化运行,因此比较低端。

    大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的《图书管理系统》来写。用python写是因为py有自带的GUI,即tkinter模块,对初次接触GUI的新手会比较友好。编译器我用的是Pycharm,你需要检查你的编译器是否带了tkinter模块和pymysql模块,没有的话需要下载安装,具体方法可以百度,很简单。界面很丑,凑合看哦!如果你没有了解过tkinter,建议先去知乎,csdn上面搜索自学一下入门教程,这样就比较容易理解我的东西啦!
    ** 特别注意:数据库表是我后来根据记忆建的,可能跟代码中的SQL语句的顺序有出入,实际数据库的字段值属性值顺序按照代码里的为准,修改一下数据库就好啦!代码是没问题的o( ̄︶ ̄)o **
    在这里插入图片描述

    二、建立数据库library

    ** 特别注意:这个表是我后来根据记忆建的,可能跟代码中的SQL语句的顺序有出入,实际数据库的字段值属性值顺序按照代码里的为准,修改一下数据库就好啦!代码是没问题的o( ̄︶ ̄)o **
    在这里插入图片描述
    如图所示,软件是Navicat,给library建表。

    2.1 book表

    存储图书的相关信息,包括书名,作者,类型,数量。主码是name和author。
    在这里插入图片描述

    2.2 borrow表

    借书单,存储借书人ID,书名,作者,借书时间。主码是name和author。
    在这里插入图片描述

    2.3 user表

    使用者,包括ID,password,job是个只有1位的数字,0表示读者,1表示管理员,登录的时候通过检测其job然后选择是跳转到读者界面还是管理员界面。
    在这里插入图片描述

    三、各个模块介绍

    在这里插入图片描述

    3.1 初始界面initial

    import tkinter as tk
    import reader
    import manager
    
    def frame():#初始界面
        global root
        root=tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0=tk.Label(root,text='欢迎来到XDU图书馆',bg='pink',font=('微软雅黑',50)).pack()#上
    	#canvas是个画布,想要插入图片的话首先要定义个canvas
        canvas=tk.Canvas(root,height=500,width=500)#中
        image_file=tk.PhotoImage(file='2.gif')
        #图片文件的后缀必须是.gif,且亲测不能自行鼠标右键重命名更改成.gif,要用win10里内置的画图功能,打开图片然后另存为的时候选择.gif
        #图片文件必须放到你的项目目录里边才有效
        image=canvas.create_image(250,100,image=image_file)
        canvas.place(x=170,y=170)
    
        lable1=tk.Label(root,text='请选择用户类型:',font=('微软雅黑',20)).place(x=80,y=500)#下
        tk.Button(root, text='读  者',font=('微软雅黑',15),width=10, height=2,command=exit_reader).place(x=350, y=420)
        tk.Button(root, text='管理员',font=('微软雅黑',15),width=10, height=2,command=exit_manager).place(x=350, y=550)
    
        root.mainloop()#必须要有这句话,你的页面才会动态刷新循环,否则页面不会显示 
    
    def exit_reader():#跳转至读者界面
        root.destroy()
        reader.frame()
    
    def exit_manager():#跳转至管理员界面
        root.destroy()
        manager.frame()
    
    if __name__ == '__main__':
        frame()
    
    

    在这里插入图片描述
    效果就是上面这样的。
    这个初始界面就比较简单,点击读者跳转到读者界面,点击管理员跳转到管理员界面。

    3.2 manager登录注册模块

    当我们从初始界面选择“管理员”,那么这时候调用exit_manager()函数,来到了管理员界面

    import tkinter as tk
    import tkinter.messagebox as msg #这个是会弹出一个警告/提示小框
    import initial
    import pymysql
    import ID
    
    def frame():#管理员界面
        global root
        root= tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0 = tk.Label(root, text='管理员登录', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        canvas = tk.Canvas(root, height=500, width=500)  # 中
        image_file = tk.PhotoImage(file='2.gif')
        image = canvas.create_image(250, 100, image=image_file)
        canvas.place(x=190, y=170)
    
        lable1 = tk.Label(root, text='请选择:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(root, text='登录', font=('微软雅黑', 15), width=10, height=2, command=login).place(x=150, y=500)
        tk.Button(root, text='注册', font=('微软雅黑', 15), width=10, height=2, command=register).place(x=350, y=500)
        tk.Button(root, text='退出', font=('微软雅黑', 15), width=10, height=2, command=exit_manager).place(x=550, y=500)
        root.mainloop()
    
    def login():#登录小窗口
        global root1
        root1=tk.Tk()
        root1.wm_attributes('-topmost', 1)#将登录窗口置顶不至于被遮到下面
        root1.title('管理员登录')
        root1.geometry('500x300')
    
        lable1 = tk.Label(root1, text='账号:', font=25).place(x=100,y=50)
        lable2 = tk.Label(root1, text='密码:', font=25).place(x=100, y=100)
    
        global entry_name, entry_key
        name=tk.StringVar()
        key = tk.StringVar()
    
        entry_name = tk.Entry(root1, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root1, textvariable=key, font=25,show='*')
        entry_key.place(x=180,y=100)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda:
        button1 = tk.Button(root1, text='确定', height=2, width=10, command=lambda: ID.id_check('1'))
        button1.place(x=210, y=180)
    #当我们输入账号和密码,点击确定时候,会调用ID模块里的id_check()函数,1是参数,表示其身份是管理员
    def register():#注册小窗口
        global root2
        root2 = tk.Tk()
        root2.wm_attributes('-topmost', 1)
        root2.title('管理员注册')
        root2.geometry('500x300')
    
        lable1 = tk.Label(root2, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root2, text='密码:', font=25).place(x=100, y=100)
        lable2 = tk.Label(root2, text='确认密码:', font=25).place(x=80, y=150)
    
        global entry_name, entry_key, entry_confirm
        name = tk.StringVar()
        key = tk.StringVar()
        confirm = tk.StringVar()
        entry_name = tk.Entry(root2, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root2, textvariable=key, font=25, show='*')
        entry_key.place(x=180, y=100)
        entry_confirm = tk.Entry(root2, textvariable=confirm,font=25, show='*')
        entry_confirm.place(x=180, y=150)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda:
        button1 = tk.Button(root2, text='确定', height=2, width=10, command=lambda: ID.id_write('1'))
        button1.place(x=210, y=200)
    #当我们点击确定的时候,会调用ID模块里的id_write()函数,1是参数,表示其身份是管理员
    def exit_manager():#退出管理员界面,跳转至初始界面
        root.destroy()
        initial.frame()
    
    

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

    3.3 ID模块

    ID模块相当于后端了,主要实现连接数据库,检查账号的有无,核对密码,注册等功能。

    import tkinter as tk
    import tkinter.messagebox as msg
    import pymysql
    import initial
    import manager
    import reader
    import m_operation
    import r_operation
    def id_check(a):#检查账号
        global id
        if a == '1':#在管理员界面下登录,参数是1
        #把账号/密码框框里输入的字符串赋值给id/password
            id = manager.entry_name.get()
            password = manager.entry_key.get()
        else:#在读者界面下登录,参数是0
            id = reader.entry_name.get()
            password = reader.entry_key.get()
        getid()#最后得到id
        #连接数据库,root是你数据库的用户名,应该是默认的是root,qwer是你数据库的密码,library是你要连接的数据库名字
        db = pymysql.connect("localhost", "root", "qwer", "library")
        #建立游标cursor,这个游标可以类比指针,这样理解比较直观
        cursor = db.cursor()
        sql = "SELECT password FROM user WHERE id='%s' AND job='%s'" % (id,a)
        cursor.execute(sql) #sql语句被执行
        result = cursor.fetchone()#得到的结果返回给result数组
        if result:#如果查询到了账号存在
                if password == result[0]:#result[0]是数组中的第一个结果
                    success_login(a)#密码对上了,进入对应的读者/管理员操作界面
                else:#有账号但密码没对上
                   msg._show(title='错误!',message='账号或密码输入错误!')
        else:#没有账号
            msg._show(title='错误!',message='您输入的用户不存在!请先注册!')
            if a=='1':
                manager.root1.destroy()#关闭登录小窗口,回到管理员界面
            elif a=='0':
                reader.root1.destroy()
        db.close()#查询完一定要关闭数据库啊
    
    def success_login(a):#成功登录
        if a == '1':
            manager.root1.destroy()
            m_operation.frame()#销毁登录注册界面,跳转到管理员的操作界面
    
        elif a == '0':
            reader.root1.destroy()
            r_operation.frame()#销毁登录注册界面,跳转到读者的操作界面
    
    def id_write(a):#写入(注册)账号
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        if a=='1':#跟check函数里边十分类似
            id = manager.entry_name.get()#得到输入的账号
            password = manager.entry_key.get()#得到输入的密码
            confirm = manager.entry_confirm.get()#得到输入的确认密码
        elif a=='0':
            id = reader.entry_name.get()
            password = reader.entry_key.get()
            confirm = reader.entry_confirm.get()
    
        sql0 = "SELECT id FROM user WHERE id='%s' AND job='%s'" % (id,a)
        sql1 = "INSERT INTO user VALUES(%s,%s,%s) " % (id, password, a)
    #首先检查两次输入的密码是否一致,一致后再检查注册的账号是否已经存在
        if password == confirm:
            cursor.execute(sql0)
            result = cursor.fetchone()
            if result:
                msg.showerror(title='错误!', message='该账号已被注册,请重新输入!')
            else:
                cursor.execute(sql1)
                db.commit()
                db.close()
                msg.showinfo(title='成功!', message='注册成功,请登录!')
    
        else:
            msg.showerror(title='错误!', message='两次密码不一致,请重新输入!')
    
    def getid():
        return id
    

    3.4 reader登录注册模块

    同2.2,如法炮(pao二声)制。
    (咳咳学好语文也好重要呀!)

    import tkinter as tk
    import initial
    import ID
    def frame():
        global root
        root= tk.Tk()
        root.geometry('900x700')
        root.title('西电图书管理系统')
        lable0 = tk.Label(root, text='读者登录', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        canvas = tk.Canvas(root, height=500, width=500)  # 中
        image_file = tk.PhotoImage(file='2.gif')
        image = canvas.create_image(250, 100, image=image_file)
        canvas.place(x=190, y=170)
    
        lable1 = tk.Label(root, text='请选择:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(root, text='登录', font=('微软雅黑', 15), width=10, height=2, command=login).place(x=150, y=500)
        tk.Button(root, text='注册', font=('微软雅黑', 15), width=10, height=2, command=register).place(x=350, y=500)
        tk.Button(root, text='退出', font=('微软雅黑', 15), width=10, height=2, command=exit_reader).place(x=550, y=500)
        root.mainloop()
    
    def login():
        global root1
        root1=tk.Tk()
        root1.wm_attributes('-topmost', 1)
        root1.title('读者登录')
        root1.geometry('500x300')
    
        lable1 = tk.Label(root1, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root1, text='密码:', font=25).place(x=100, y=100)
    
        global entry_name, entry_key
        name=tk.StringVar()
        key = tk.StringVar()
    
        entry_name=tk.Entry(root1,textvariable=name,font=25)
        entry_name.place(x=180,y=50)
        entry_key=tk.Entry(root1, textvariable=key, font=25,show='*')
        entry_key.place(x=180,y=100)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda
        button1=tk.Button(root1,text='确定',height=2,width=10,command=lambda :ID.id_check('0'))
        button1.place(x=210,y=180)
    
    def register():
        global root2
        root2 = tk.Tk()
        root2.wm_attributes('-topmost', 1)
        root2.title('读者注册')
        root2.geometry('500x300')
    
        lable1 = tk.Label(root2, text='账号:', font=25).place(x=100, y=50)
        lable2 = tk.Label(root2, text='密码:', font=25).place(x=100, y=100)
        lable2 = tk.Label(root2, text='确认密码:', font=25).place(x=80, y=150)
    
        global entry_name, entry_key, entry_confirm
        name = tk.StringVar()
        key = tk.StringVar()
        confirm = tk.StringVar()
        entry_name = tk.Entry(root2, textvariable=name, font=25)
        entry_name.place(x=180, y=50)
        entry_key = tk.Entry(root2, textvariable=key, font=25, show='*')
        entry_key.place(x=180, y=100)
        entry_confirm = tk.Entry(root2, textvariable=confirm,font=25, show='*')
        entry_confirm.place(x=180, y=150)
        # 百度:tkinter要求由按钮(或者其它的插件)触发的控制器函数不能含有参数,若要给函数传递参数,需要在函数前添加lambda
        button1 = tk.Button(root2, text='确定', height=2, width=10, command=lambda: ID.id_write('0'))
        button1.place(x=210, y=200)
    
    def exit_reader():#退出管理员界面,跳转至初始界面
        root.destroy()
        initial.frame()
    
    

    3.5 m_operation管理员操作界面

    当我们终于成功注册/登录之后,来到了管理员的操作界面。
    在这里插入图片描述

    import tkinter as tk
    import tkinter.messagebox as msg
    import search
    from tkinter import ttk
    import pymysql
    def frame():
        window=tk.Tk()
        window.title('管理员')
        window.geometry('900x700')
        lable0 = tk.Label(window, text='欢迎来到XDU图书馆', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        lable1 = tk.Label(window, text='请选择操作:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(window, text='进购图书', font=('微软雅黑', 15), width=10, height=2,command=purchase).place(x=350, y=250)
        tk.Button(window, text='注销图书', font=('微软雅黑', 15), width=10, height=2,command=cancel).place(x=350, y=350)
        tk.Button(window, text='信息查询', font=('微软雅黑', 15), width=10, height=2,command=search.frame).place(x=350, y=450)
        window.mainloop()
    
    def purchase():#进购图书
        global win
        win = tk.Tk()
        win.title('管理员')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写进购图书的信息:', font=('微软雅黑', 20)).place(x=30, y=100)
    
        tk.Label(win, text='图书类目:', font=('宋体', 12)).place(x=30, y=200)
        global list#这个是一个下拉页表项,只能从下面的list['values']里边选
        comvalue = tk.StringVar()
        list = ttk.Combobox(win, textvariable=comvalue, height=10, width=10)
        list.place(x=100, y=200)
        list['values'] = ('全部', '人文', '艺术', '计算机', '科技', '杂志')
        list.current(0)#默认显示'全部'
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        global price
        tk.Label(win, text='价格:', font=('宋体', 12)).place(x=460, y=200)
        price = tk.Entry(win, font=('宋体', 12), width=10)
        price.place(x=510, y=200)
    
        global amount
        tk.Label(win, text='数量:', font=('宋体', 12)).place(x=560, y=200)
        amount = tk.Entry(win, font=('宋体', 12), width=5)
        amount.place(x=610, y=200)
    
        tk.Button(win, text='确认添加', font=('宋体', 12), width=10, command=add).place(x=700, y=195)
        
    def add():#添加图书信息到数据库中
        sql="INSERT INTO book VALUES('%s','%s','%s','%s','%s')"% (list.get(),b_name.get(),author.get(),price.get(),amount.get())
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        db.commit()#这句不可或缺,当我们修改数据完成后必须要确认才能真正作用到数据库里
        db.close()
        msg.showinfo(title='成功!', message='新书已入库!')
    def cancel():#撤销图书
        global win
        win = tk.Tk()
        win.title('管理员')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写注销图书的信息:', font=('微软雅黑', 20)).place(x=30, y=100)
    
        tk.Label(win, text='图书类目:', font=('宋体', 12)).place(x=30, y=200)
        global list
        comvalue = tk.StringVar()
        list = ttk.Combobox(win, textvariable=comvalue, height=10, width=10)
        list.place(x=100, y=200)
        list['values'] = ('全部', '人文', '艺术', '计算机', '科技', '杂志')
        list.current(0)
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        tk.Button(win, text='确认注销', font=('宋体', 12), width=10, command=delete).place(x=600, y=195)
    
    def delete():删除图书
        sql = "DELETE FROM book WHERE type='%s' AND name='%s' AND author='%s'" % (list.get(),b_name.get(),author.get())
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        db.commit()#这句不可或缺,当我们修改数据完成后必须要确认才能真正作用到数据库里
        msg.showinfo(title='成功!', message='该书已删除!')
    
    

    在这里插入图片描述

    3.6 r_operation读者操作模块

    如2.5,如法炮制。但是要引入py内置的datetime模块

    import tkinter as tk
    import tkinter.messagebox as msg
    from tkinter import ttk
    import search
    import ID
    import datetime as dt#datetime
    import pymysql
    
    def frame():
        window2=tk.Tk()
        window2.title('读者')
        window2.geometry('700x600')
        lable0 = tk.Label(window2, text='欢迎来到XDU图书馆', bg='pink', font=('微软雅黑', 50)).pack()  # 上
    
        lable1 = tk.Label(window2, text='请选择操作:', font=('微软雅黑', 20)).place(x=80, y=400)  # 下
        tk.Button(window2, text=' 借  书', font=('微软雅黑', 15), width=10, height=2,command=borrow).place(x=350, y=250)
        tk.Button(window2, text=' 还  书', font=('微软雅黑', 15), width=10, height=2,command=turnback).place(x=350, y=350)
        tk.Button(window2, text='信息查询', font=('微软雅黑', 15), width=10, height=2,command=search.frame).place(x=350, y=450)
        window2.mainloop()
    
    def borrow():
        global win
        win = tk.Tk()
        win.title('读者')
        win.geometry('900x300')
        win.wm_attributes('-topmost', 1)
        lable1 = tk.Label(win, text='请填写所借图书的信息:(书名作者都要填写正确无误!)', bg='pink',font=('微软雅黑', 20)).place(x=30, y=100)
    
        global b_name
        tk.Label(win, text='书名:', font=('宋体', 12)).place(x=200, y=200)
        b_name = tk.Entry(win, font=('宋体', 12), width=10)
        b_name.place(x=250, y=200)
    
        global author
        tk.Label(win, text='作者:', font=('宋体', 12)).place(x=350, y=200)
        author = tk.Entry(win, font=('宋体', 12), width=10)
        author.place(x=400, y=200)
    
        tk.Button(win, text='确认借书', font=('宋体', 12), width=10, command=confirm_borrow).place(x=600, y=195)
    
    def confirm_borrow():
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        sql0="SELECT amount FROM book WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
        cursor.execute(sql0)
        result=cursor.fetchone()
        if result:
            if result != '0':
                time = dt.datetime.now().strftime('%F')#得到的时间不是字符串型,我们要把时间转化成字符串型
                sql = "INSERT INTO borrow VALUES('%s','%s','%s','%s')" % (ID.getid(),b_name.get(),author.get(),time)
                sql1="UPDATE book SET amount=amount-1 WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
                cursor.execute(sql)
                cursor.execute(sql1)
                db.commit()
                db.close()
                msg.showinfo(title='成功!', message='借书成功!请一个月之内归还')
            else:
                msg.showinfo(title='失败!', message='您借的书库存不足!')
        else:
            msg.showinfo(title='错误!', message='未找到该书!')
    
    def turnback():#还书
        global win
        win = tk.Tk()
        win.title('读者')
        win.geometry('550x600')
    
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        sql0 = "SELECT COUNT(*) FROM borrow WHERE id='%s'" % (ID.getid())
        cursor.execute(sql0)
        result = cursor.fetchone()
        if result[0]==0:
            msg.showinfo(title='错误', message='您还没借过书呢!')
        else :
            lable1 = tk.Label(win, text='查询到您有以下书目未还:', bg='pink', font=('微软雅黑', 20)).place(x=80, y=20)
            tree = ttk.Treeview(win, columns=('1', '2'), show="headings")
            tree.column('1', width=150, anchor='center')
            tree.column('2', width=150, anchor='center')
            tree.heading('1', text='书名')
            tree.heading('2', text='作者')
            tree.place(x=100, y=100)
    
            sql1 = "SELECT bookname,author FROM borrow WHERE id='%s'" % (ID.getid())
            cursor.execute(sql1)
            result1 = cursor.fetchall()
            for i in range(0,result[0]):
                tree.insert('', i, values=(result1[i]))
    
            lable2 = tk.Label(win, text='请输入还书信息:', bg='pink', font=('微软雅黑', 20)).place(x=80, y=360)
            lable22=tk.Label(win, text='书名作者都要填写正确无误!', bg='pink', font=('微软雅黑', 20)).place(x=80, y=400)
            global b_name
            tk.Label(win, text='书名:', font=('宋体', 12)).place(x=80, y=480)
            b_name = tk.Entry(win, font=('宋体', 12), width=10)
            b_name.place(x=130, y=480)
    
            global author
            tk.Label(win, text='作者:', font=('宋体', 12)).place(x=230, y=480)
            author = tk.Entry(win, font=('宋体', 12), width=10)
            author.place(x=280, y=480)
    
            tk.Button(win, text='确认还书', font=('宋体', 12), width=10, command=confirm_turnback).place(x=395, y=480)
        db.close()
    
    def confirm_turnback():
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
    
        sql1 = "UPDATE book SET amount=amount+1 WHERE name='%s' AND author='%s'" % (b_name.get(), author.get())
        cursor.execute(sql1)
        db.commit()
    
        time1=dt.datetime.now()#获取现在的时间
        sql2="SELECT date FROM borrow WHERE bookname='%s' AND author='%s'"%(b_name.get(),author.get())
        cursor.execute(sql2)
        result = cursor.fetchone()
        day=(time1-result[0]).days#得到时间差,检查图书是否超期
        print(day)
        if day>30:
            msg.showinfo(title='还书成功', message='还书成功,但您已经超期!请下次按时归还')
        else:
            msg.showinfo(title='还书成功', message='还书成功,且未超过30天')
    
        sql0 = "DELETE FROM borrow WHERE bookname='%s' AND author='%s'"%(b_name.get(), author.get())
        cursor.execute(sql0)
        db.commit()
        db.close()
        win.destroy()
    

    3.7 search模块(动态查询)

    由于管理员和读者都有查询图书的功能,故为了减少代码,尽量代码重用,将该功能做成模块。search中要有动态查询,即查询条件的个数是可以改变的。

    import tkinter as tk
    import tkinter.messagebox as msg
    from tkinter import ttk
    import pymysql
    
    def frame():
        global window
        window = tk.Tk()
        window.title('图书查询')
        window.geometry('1200x700')
    
        tk.Label(window,text='图书类目:',font=('宋体',12)).place(x=220,y=30)
    
        global list
        comvalue=tk.StringVar()
        list=ttk.Combobox(window,textvariable=comvalue,height=10,width=10)
        list.place(x=300,y=30)
        list['values']=('全部','人文','艺术','计算机','科技','杂志')
        list.current(0)
    
        global b_name
        tk.Label(window, text='书名:', font=('宋体', 12)).place(x=450, y=30)
        b_name=tk.Entry(window,font=('宋体', 12),width=15)
        b_name.place(x=500,y=30)
    
        global author
        tk.Label(window, text='作者:', font=('宋体', 12)).place(x=650, y=30)
        author = tk.Entry(window, font=('宋体', 12), width=15)
        author.place(x=700, y=30)
    
        tk.Button(window,text='搜索',font=('宋体', 12), width=10,command=search).place(x=900,y=25)
        global tree#建立树形图
        yscrollbar = ttk.Scrollbar(window, orient='vertical')#右边的滑动按钮
        tree = ttk.Treeview(window, columns=('1', '2', '3', '4', '5'), show="headings",yscrollcommand=yscrollbar.set)
        tree.column('1', width=150, anchor='center')
        tree.column('2', width=150, anchor='center')
        tree.column('3', width=150, anchor='center')
        tree.column('4', width=150, anchor='center')
        tree.column('5', width=150, anchor='center')
        tree.heading('1', text='类目')
        tree.heading('2', text='书名')
        tree.heading('3', text='作者')
        tree.heading('4', text='价格')
        tree.heading('5', text='库存')
        tree.place(x=200, y=150)
        yscrollbar.place(x=955,y=150)
        window.mainloop()
    
    def search():
    #我用了最原始的方法来动态查询
        if list.get()=='全部'and b_name.get()=='' and author.get()=='' :
            sql="SELECT * FROM book "
        elif list.get()=='全部'and b_name.get()=='' and author.get()!='' :
            sql="SELECT * FROM book WHERE author='%s'"%(author.get())
        elif list.get()=='全部'and b_name.get()!='' and author.get()=='' :
            sql = "SELECT * FROM book WHERE name='%s'" % (b_name.get())
        elif list.get() != '全部'  and b_name.get() =='' and author.get() == '' :
            sql = "SELECT * FROM book WHERE type='%s'" % (list.get())
        elif list.get()=='全部'and b_name.get() !='' and author.get()!= '' :
            sql = "SELECT * FROM book WHERE name='%s' AND author='%s'" % (b_name.get(),author.get())
        elif list.get() != '全部' and b_name.get() !='' and author.get() == '' :
            sql = "SELECT * FROM book WHERE type='%s' AND name='%s'" % (list.get(),b_name.get())
        elif list.get() != '全部' and b_name.get() =='' and author.get() != '' :
            sql = "SELECT * FROM book WHERE type='%s' AND author ='%s'" % (list.get(), author.get())
        else :
            sql = "SELECT * FROM book WHERE type='%s' AND name='%s' AND author ='%s'" % (list.get(),b_name.get(), author.get())
    
        db = pymysql.connect("localhost", "root", "qwer", "library")
        cursor = db.cursor()
        cursor.execute(sql)
        results=cursor.fetchall()
        if results:
            l= len(results)
            for i in range(0,l):#查询到的结果依次插入到表格中
                tree.insert('',i,values=(results[i]))
        else :
            tree.insert('', 0,values=('查询不到结果','查询不到结果','查询不到结果','查询不到结果','查询不到结果'))
    
        db.close()
    

    四、总结

    这是一个较为简单的图书管理系统,其中仍有一些不足。比如人人都能注册管理员账号然后修改图书信息,这会造成系统的不安全。还有就是我们默认的读者借书时候会先查询图书信息,得到图书信息后填写的书名和作者必定是正确的,我没有加上相应的错误处理。然后读者借书超期后有惩罚措施,比如无法借书或限制借书的数量,这个我没有实现,仅仅是提醒了读者有图书已超期。如果有相关问题,欢迎私信作者共同探讨。

    提示:转发应得到作者同意,注明出处。

    展开全文
  • 题目:写一个简单的图书...学校二手书是个大市场,A老师决定涉足这个领域,她需要写一个图书管理系统帮她管理书籍的借阅情况,她希望这个程序可以做到:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭...

    题目:写一个简单的图书借阅系统‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    学校二手书是个大市场,A老师决定涉足这个领域,她需要写一个图书管理系统帮她管理书籍的借阅情况,她希望这个程序可以做到:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    1. 查询书籍:可以一键查询系统里所有书籍的信息和借阅情况‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
    2. 添加书籍:往系统添加书籍时,需要输入书籍的基本信息(书名,作者,推荐理由)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
    3. 借阅书籍:当书籍的状态是“未借出”的时候,书籍才可以借,借出以后的书籍状态为“已借出”‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
    4. 归还书籍:归还成功后书籍的状态会更改成“未借出”,下一个同学可以再借了。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    既然已经学习了类和对象,所以不用考虑其他编程模式。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    类的两种用法:1. 类作为实例对象的模板 2. 类作为函数包。第一种用法是使用类生成实例对象。类作为实例对象的模版,每个实例创建后,都将拥有类的所有属性和方法。第二种用法是用类将多个函数(方法)打包封装在一起,让类中的方法相互配合。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    该项目中,处理的对象是每本具体的书籍,每本书都有自己的属性信息,由此,可以定义一个Book类,利用Book类创建一个个书的实例,绑定属性(第一种用法)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    而对于而这个管理系统的运行主体,是多个可供选择的功能的叠加,所以我们可以创建一个系统运行类BookManager,将查询书籍、添加书籍等功能封装成类中的方法以供调用(第二种用法)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    课堂上,我们已编写了基本功能,见附件1BookRent.py‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    ------------------------------------------‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    对程序进行改造升级:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬

    1. 图书信息从CSV文件获取(附件2),注意在借阅和归还时修改图书的状态‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
    2. 考虑对书籍进行分类:继承Book类,创建一些子类,例如,FictionBook,改造其初始化方法,增加参数type=‘玄幻类’‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬
    3. 实现模糊查询:例如,让用户输入作者名,就能打印出系统里该作者所有书籍的相关信息;输入玄幻类,打印出所有这类书籍的相关信息

    CSV表格部分如下:
    在这里插入图片描述

    代码:

    # coding = utf-8
    import csv
    from itertools import islice
    import pandas as pd
    import os
    
    
    class Book:
        def __init__(self, name, author, recommendation, type, status=0):  # 对实例属性进行初始化
            self.name = name
            self.author = author
            self.recommendation = recommendation
            self.status = status
            self.type = type
    
        def __str__(self):
            if self.status == 1:
                status = '已借出'
            else:
                status = '未借出'
            return '名称:《%s》作者:%s 推荐语:%s 类别: %s 状态:%s ' % (self.name, self.author, self.recommendation, self.type, status)
    
    
    class FictionBook(Book):
        def __init__(self, type='奇幻'):
            self.type = type
    
    
    class NovelBook(Book):
        def __init__(self, type='小说'):
            self.type = type
    
    
    class JottingsBook(Book):
        def __init__(self, type='随笔'):
            self.type = type
    
    
    class BookManager:
        books = []
    
        def __init__(self):
            f = open('BookInfos.csv', 'r')
            readers = csv.reader(f)
            for row in islice(readers, 1, None):
                self.books.append(Book(row[0], row[1], row[2], row[3], row[4]))
            f.close()
    
        def menu(self):  # 显示选择菜单,根据不同菜单的选项调用不同的方法
            print('欢迎使用大数据团队图书节约系统,每本书都是好书,希望钟老师的市场越来越好。\n')
            while True:
                print(' 1.查询书籍\n 2.添加书籍\n 3.借阅书籍\n 4.归还书籍\n 5.退出系统\n')
                choice = int(input('请输入数字选项对应的功能,例如:1(指....)'))
                if choice == 1:
                    self.show_all_book()
                elif choice == 2:
                    self.add_book()
                elif choice == 3:
                    self.lend_book()
                elif choice == 4:
                    self.return_book()
                elif choice == 5:
                    print('感谢使用!欢迎下次再来!')
                    break
    
        def show_all_book(self):  # 显示书籍信息
            print("1.查询作者相关书籍\n2.查询类别相关书籍\n3.查询所有书籍")
            ch = eval(input('请输入你的选择:例如:1(指....)'))
            if ch == 1:
                author = input("请输入作者名字:")
                for book in self.books:
                    if book.author == author:
                        print('')
                        print(book)
            elif ch == 2:
                type = input("请输入书籍类别:")
                for book in self.books:
                    if book.type == type:
                        print('')
                        print(book)
            elif ch == 3:
                for book in self.books:
                    print('')
                    print(book)
            else:
                print("您的输入有误噢!")
    
        def add_book(self):  # 添加书籍
            new_name = input('请输入书籍的名字:')
            new_author = input('请输入书籍的作者:')
            new_comment = input('请输入书籍的推荐语:')
            new_type = input('请输入书籍的类别:')
            new_book = [new_name, new_author, new_comment, new_type, 0]
            # 写入CSV文件
            f = open('BookInfos.csv', 'a+')
            writer = csv.writer(f)
            writer.writerow(new_book)
            f.close()
            # 改变books[]
            self.books.append(Book(new_book[0], new_book[1], new_book[2], new_book[3], new_book[4]))
            print('书籍录入成功!\n')
    
        def check_book(self, name):  # 检查是否存在该书籍
            for book in self.books:
                if book.name == name:
                    return book
            else:
                return -1
    
        def lend_book(self):  # 借阅书籍
            name = input('请输入你想借阅的书籍名字:')
            res = self.check_book(name)
            if res != -1:
                if res.status == 1:
                    print('你来晚了,这本书已经被借走了')
                else:
                    print('借阅成功!借了不看会变胖~~~')
                    res.status = 1
                    manager.change_status(name)
            else:
                print('这本书暂时没有在系统里!')
    
        def return_book(self):  # 归还书籍
            name = input('请输入归还书籍的名字:')
            res = self.check_book(name)
            if res == -1:
                print('没有这本书,你恐怕输错书名了~')
            else:
                if res.status == 0:
                    print('这本书没有被借走!')
                else:
                    print('归还成功')
                    res.status = 0
                    manager.change_status(name)
                    # 这里我做实验时有些些问题,去掉manager.会出现 name is not defined 学艺不精,还不够了解python,见谅
    
        @staticmethod
        def change_status(name):  # 修改CSV文件中借还书籍的状态
            in_file = open("BookInfos.csv", "r")
            reader = csv.reader(in_file)
            out_file = open("BookInfos1.csv", "w", newline='')
            writer = csv.writer(out_file)
            for row in reader:
                if row[0] == name:
    
                    if row[4] == '0':
                        row[4] = '1'
                    else:
                        row[4] = '0'
                writer.writerow(row)
            in_file.close()
            out_file.close()
            os.remove("BookInfos.csv")  # 删除原文件
            os.rename("BookInfos1.csv", "BookInfos.csv")  # 重命名写入文件,此法不可取,但是我暂时找不到好的方法了
            print("已修改CSV文件")
            # 这里我做实验时也有些些问题。1.不会修改特定单元格,2.选择了修改后替换原文件的方法,此法若真实用于大型文件管理,会导致效率大幅度降低,不可取,见谅
    
    
    manager = BookManager()
    manager.menu()
    
    

    此次实验前前后后断断续续做了5天左右,主要还是对python的CSV模块不太熟悉,建议大家好好学习哈哈哈哈(流下了不学无术的泪…)

    展开全文
  • gui图书管理系统和演示,希望大家指点,做的不好不要见笑哦
  • python+mysql设计简单GUI图书管理系统

    千次阅读 多人点赞 2020-07-08 23:22:52
    图书管理系统:界面设计的比较丑请忽略 数据要求 根据系统的需求,将需要的数据分类记录如下: (1) 图书信息:编号、名称、储量、作者、出版时间 (2) 图书借阅信息:读者学号、图书编号、记录编号、借书日期、还...

    图书管理系统:界面设计的比较丑请忽略
    数据要求
    根据系统的需求,将需要的数据分类记录如下:
    (1) 图书信息:编号、名称、储量、作者、出版时间
    (2) 图书借阅信息:读者学号、图书编号、记录编号、借书日期、还书日期
    (3) 读者信息:学号、姓名、性别、班级、剩余最大借书量
    (4) 管理者信息:管理者姓名、职工号、权限级别

    服务端:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    客户端:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    import tkinter as tk
    import tkinter.messagebox as msg
    import pymysql
    import os
    
    BACK_PATH="resources"+os.sep+"background.gif"
    
    
    def check_book():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        a = input_book.get()
        sql = "SELECT * FROM book WHERE bname = '%s'" % (a)
        cursor.execute(sql)
        results = cursor.fetchone()
        if results:
            root3 = tk.Tk()
            root3.title('查询到的书')
            val = "您要查询的书号为:%s" % (results[0])
            print1 = tk.Label(root3, text=val)
            print1.grid(row=0, column=0, padx=10, pady=5)
            val = "您要查询的书号为:%s" % (results[0])
            print2 = tk.Label(root3, text=val)
            print2.grid(row=1, column=0, padx=10, pady=5)
            val = "您要查询的书的作者为:%s" % (results[1])
            print3 = tk.Label(root3, text=val)
            print3.grid(row=2, column=0, padx=10, pady=5)
            val = "您要查询的书的作者为:%s" % (results[2])
            print4 = tk.Label(root3, text=val)
            print4.grid(row=3, column=0, padx=10, pady=5)
            val = "您要查询的书名为:%s" % (results[3])
            print5 = tk.Label(root3, text=val)
            print5.grid(row=4, column=0, padx=10, pady=5)
            val = "您要查询的书的出版日期为:%s" % (results[4])
            print6 = tk.Label(root3, text=val)
            print6.grid(row=5, column=0, padx=10, pady=5)
        else:
            msg._show(title='错误', message='没有查到您要查询的记录')
        db.close()
    
    def borrow_end():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        id = input_id.get()
        name = input8.get()
        sql = "SELECT bid,num FROM book WHERE bname='%s'" % (name)
        cursor.execute(sql)
        results = cursor.fetchone()
        if results[1] > 0:
            sql = "INSERT INTO borrow(rid,bid,btime) VALUES(%s,%s,CURDATE())" % (id, results[0])
            try:
                cursor.execute(sql)
                db.commit()
                msg._show(title="成功",message="借阅成功!")
            except:
                msg._show(title="系统故障",message="借阅失败!")
        else:
            msg._show(title="库存量不足",message="对不起,您要借阅的图书库存不足!")
        db.close()
    
    def return_end():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        id = input_id.get()
        name = input9.get()
        sql = "SELECT bid FROM book WHERE bname = '%s'" % (name)
        cursor.execute(sql)
        results = cursor.fetchone()
        sql = "SELECT lid FROM borrow WHERE bid=%s AND rid=%s" % (results[0], id)
        cursor.execute(sql)
        result = cursor.fetchone()
        sql = "UPDATE borrow SET rtime=CURDATE()WHERE lid= %s"%(result[0])
        try:
            cursor.execute(sql)
            db.commit()
            msg._show(title='成功',message='还书成功')
        except:
            msg._show(title='系统故障',message='还失败')
        db.close()
    
    def donate_end():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        id = input_id.get()
        name = input10.get()
        amount = input11.get()
        write = input12.get()
        tim= input13.get()
        sql = "SELECT num FROM book WHERE bname='%s'" % (name)
        cursor.execute(sql)
        results = cursor.fetchone()
        if results:
            sql = "UPDATE book SET num=num+%s WHERE bname='%s'" % (amount, name)
            try:
                cursor.execute(sql)
                db.commit()
                msg._show(title="成功",message="捐书成功!谢谢您")
            except:
                msg._show(title="系统故障",message="捐书失败")
                db.rollback()
        else:
            sql = "SELECT MAX(bid) FROM book"
            cursor.execute(sql)
            results = cursor.fetchone()
            results[0] = results[0] + 1
            sql = "INSERT INTO book VALUES (%s,'%s',%s,'%s','%s')" % (results, write, amount, name, tim)
            try:
                cursor.execute(sql)
                db.commit()
                msg._show(title="成功", message="捐书成功!谢谢您")
            except:
                msg._show(title="错误", message="输入信息有误")
                db.rollback()
        db.close()
    
    def book_select():
        v1=tk.StringVar()
        global root2
        root2=tk.Tk()
        root2.title("查询图书")
        global input_book
        labe1 = tk.Label(root2, text="请输入您要查询的图书名:", font=36).grid(row=0, column=0)
        input_book = tk.Entry(root2,textvariable=v1)
        input_book.grid(row=0,column=1)
        tk.Button(root2, text='确认', width=10, command=check_book).grid(row=1, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root2, text='取消', width=10, command=exit_login3).grid(row=1, column=1, sticky=tk.E, padx=10, pady=5)
    
    def book_borrow():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        id=input_id.get()
        sql = "SELECT bleft FROM reader WHERE rid = %s" % (id)
        cursor.execute(sql)
        result = cursor.fetchone()
        v_borrow=tk.StringVar()
        if result[0] == 0:
            msg._show(title="错误",message="你已达最大借阅量,借阅失败")
        global root2
        root2 = tk.Tk()
        root2 .title("借阅")
        global input8
        labe1 = tk.Label(root2, text="请输入您要借阅的图书名:", font=36).grid(row=0, column=0)
        input8 = tk.Entry(root2, textvariable=v_borrow)
        input8.grid(row=1,column=0)
        tk.Button(root2, text='确认', width=10, command=borrow_end).grid(row=2, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root2, text='取消', width=10, command=exit_login3).grid(row=2, column=1, sticky=tk.E, padx=10, pady=5)
        db.close()
    
    def return_book():
        global root2
        root2 = tk.Tk()
        root2.title("还书")
        v1=tk.StringVar()
        global input9
        labe1 = tk.Label(root2, text="请输入您要还的图书名:", font=36).grid(row=0, column=0)
        input9 = tk.Entry(root2, textvariable=v1)
        input9.grid(row=1, column=0)
        tk.Button(root2, text='确认', width=10, command=return_end).grid(row=2, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root2, text='取消', width=10, command=exit_login3).grid(row=2, column=1, sticky=tk.E, padx=10, pady=5)
    
    def donate_book():
        global root2
        root2 = tk.Tk()
        root2.title("捐书")
        v1 = tk.StringVar()
        v2 = tk.StringVar()
        v3 = tk.StringVar()
        v4 = tk.StringVar()
        global input10,input11,input12,input13
        labe1 = tk.Label(root2, text="请输入您要捐赠的图书名:", font=36).grid(row=0, column=0)
        labe12 = tk.Label(root2, text="请输入您要捐赠的图书的数量:", font=36).grid(row=1, column=0)
        labe13 = tk.Label(root2, text="请输入您要捐赠的作者:", font=36).grid(row=2, column=0)
        labe4 = tk.Label(root2, text="请输入您要捐赠的图书的出版时间:", font=36).grid(row=3, column=0)
        input10 = tk.Entry(root2, textvariable=v1)
        input10.grid(row=0, column=1)
        input11 = tk.Entry(root2, textvariable=v2)
        input11.grid(row=1, column=1)
        input12 = tk.Entry(root2, textvariable=v3)
        input12.grid(row=2, column=1)
        input13 = tk.Entry(root2, textvariable=v4)
        input13.grid(row=3, column=1)
        tk.Button(root2, text='确认', width=10, command=donate_end).grid(row=4, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root2, text='取消', width=10, command=exit_login3).grid(row=4, column=1, sticky=tk.E, padx=10, pady=5)
    
    
    def success_tip(id):
        root1 = tk.Tk()
        root1.title('YTU图书管理系统')
        labe1 = tk.Label(root1, text="欢迎来到YTU图书管理系统,请选择您要进行的操作:", font=36).grid(row=0, column=0)
        tk.Button(root1, text='查询图书',  command=book_select).grid(row=1, column=0)
        tk.Button(root1, text='借阅图书',  command=book_borrow).grid(row=2, column=0)
        tk.Button(root1, text='归还图书',  command=return_book).grid(row=3,  column=0)
        tk.Button(root1, text='捐赠图书',  command=donate_book).grid(row=4, column=0)
        tk.Button(root1, text='退出', command=resiger).grid(row=5, column=0)
        root1.mainloop()
    def exit_login2():
        root1.destroy()
    
    def login_check():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        id=input_id.get()
        name=input2.get()
        sql = "SELECT rname FROM reader WHERE rid='%s'" % (id)
        cursor.execute(sql)
        results = cursor.fetchone()
        if results:
                if name == results[0]:
                    success_tip(id)
                else:
                   msg._show(title='错误!',message='账号密码输入错误!')
        else:
            msg._show(title='错误!',message='您输入的用户不存在!')
        db.close()
    
    def auto_login():
        global root1
        root1 = tk.Tk()
        v1 = tk.StringVar()
        v2 = tk.StringVar()
        root1.title("登入")
        labe1=tk.Label(root1,text="学号:",font=36).grid(row=0, column=0)
        label2=tk.Label(root1,text="密码:",font=36).grid(row=1,column=0)
        global input_id,input2
        input_id = tk.Entry(root1, textvariable=v1)
        input_id.grid(row=0, column=1, padx=10, pady=5)
        input2 = tk.Entry(root1, textvariable=v2, show='*')
        input2.grid(row=1, column=1, padx=10, pady=5)
        tk.Button(root1, text='登录', width=10, command=login_check).grid(row=3, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root1, text='退出', width=10, command=exit_login2).grid(row=3, column=1, sticky=tk.E, padx=10, pady=5)
    
    def exit_login():
        root.destroy()
    
    def exit_login3():
        root2.destroy()
    
    def resiger_end():
        db = pymysql.connect("localhost", "root", "*****", "library")
        cursor = db.cursor()
        rid = input1.get()
        name = input2.get()
        sex = input3.get()
        clas = input4.get()
        sql = "INSERT INTO reader VALUES(%s,'%s','%s','%s',10)" % (rid, name, sex, clas)
        try:
            cursor.execute(sql)
            db.commit()
            msg._show(title='成功', message='注册成功!')
        except:
            msg._show(title='错误', message='注册失败!')
        db.close()
    
    def resiger():
        root2 = tk.Tk()
        root2.title("注册")
        labe1  = tk.Label(root2, text="学号:", font=36).grid(row=0,column=0)
        label2 = tk.Label(root2, text="密码:", font=36).grid(row=1,column=0)
        label3 = tk.Label(root2,text="性别:",font=36).grid(row=2,column=0)
        label4 = tk.Label(root2,text="班级:",font=36).grid(row=3,column=0)
        v1 = tk.StringVar()
        v2 = tk.StringVar()
        v3 = tk.StringVar()
        v4 = tk.StringVar()
        global input1,input2,input3,input4
        input1 = tk.Entry(root2, textvariable=v1)
        input1.grid(row=0, column=1, padx=10, pady=5)
        input2 = tk.Entry(root2, textvariable=v2, show='*')
        input2.grid(row=1, column=1, padx=10, pady=5)
        input3 = tk.Entry(root2, textvariable=v3)
        input3.grid(row=2, column=1, padx=10, pady=5)
        input4 = tk.Entry(root2, textvariable=v4,)
        input4.grid(row=3, column=1, padx=10, pady=5)
        tk.Button(root2, text='确认', width=10, command=resiger_end).grid(row=4, column=0, sticky=tk.W, padx=10, pady=5)
        tk.Button(root2, text='取消', width=10, command=exit_login3).grid(row=4, column=1, sticky=tk.E, padx=10, pady=5)
    
    def frame():
        global root
        root = tk.Tk()
        root.title('YTU图书管理系统登录')
        root.geometry("500x500")
        #photo=tk.PhotoImage(file=BACK_PATH)
        #theLabel = tk.Label(root,image = photo,compound = tk.CENTER,fg = "white").pack(fill="both",expand=1)
        tk.Button(root, text='登入', width=70,height=9, command=auto_login).grid(row=0, column=0,)
        tk.Button(root, text='注册', width=70,height=9, command=resiger).grid(row=1, column=0)
        tk.Button(root, text='退出',width=70,height=9,command=exit_login).grid(row=2, column=0)
        root.mainloop()
    
    
    if __name__ == '__main__':
        frame()
    
    展开全文
  • 主要为大家详细介绍了Python如何实现简易版图书管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • python+mysql带有gui图书管理系统2.0

    千次阅读 2020-07-25 13:49:05
    user.frame() def exit2(): root.destroy() manage.frame() def frame(): global root root = tk.Tk() root.title('YTU图书系统') photo=tk.PhotoImage(file=BACK_PATH) root.geometry("700x260") theLabel = tk....
  • 大三上学期的程序设计实训大作业,挑了其中一个我认为最简单的的《图书管理系统》来写。用python写是因为py有自带的GUI,即tkinter模块,对初次接触GUI的新手会比较友好。编译器我用的是Pycharm,你需要检查你的...
  • python GUI图书管理系统

    千次阅读 多人点赞 2019-06-05 19:10:30
    GUI图书管理系统 @author:Arsenal_Ramsey @time:2019/5/31 @进度:。。。 ''' import wx studentDatabase=dict() bookDatabase=dict() borrowDatabase=dict() class STUDENTADD(wx.Frame): def __init__(s...
  • 在拿到这个项目的时候,首先是查阅了基于Python图书管理系统可以怎么做,可以通过什么方式搭建,可以以什么样式展现。 据我目前了解到的信息,可以做成这样: 1、命令行形式运作,如输出“Hello World!"般,这个...
  • 写完这个项目后,导师说这个你完全可以当作毕业...Python项目: 项目前提: 这个项目涉及到的知识点有很多, 知识串联起来就会显得复杂,但这也是锻炼自己的一个能力。 下面先描述这个项目的大致结构。 成品图 架构
  • 到此这篇关于基于python图书管理系统设计实例详解的文章就介绍到这了,更多相关基于python图书管理系统设计内容请搜索python博客以前的文章或继续浏览下面的相关文章希望大家以后多多支持python博客!
  • 自己的Python课设,水平有限但是是原创。可以拿来学习或者应付作业。
  • python实现图书管理系统,图形化界面版

    万次阅读 多人点赞 2019-03-01 22:09:16
    # 图书管理系统UI界面 import wx import datetime class wxGUI(wx.App): # 登陆界面 def Login(self): self.frame_Login = wx.Frame(None, title="Login(20177830115邵薪冉)", size=(500, ...
  • python实现UI界面化图书管理系统

    千次阅读 多人点赞 2020-12-19 13:03:10
    图书管理系统采用的是.csv格式的文件存储的图书信息,无需安装数据库,很适合初学者。使用到了csv和pandas等第三方库,运行login.py即可。 如果有想学习程序的小伙伴们,可以加我QQ,我的QQ在下面的图片中哦,欢迎...
  • 求助python3.7界面化图书管理系统

    千次阅读 2019-06-11 16:56:18
    本人大二,需要一个python3.7可以用的简单的界面化图书管理系统,不需要连接数据库,也不需要wx库。
  • python 图形用户界面GUI

    2020-09-30 03:55:39
    Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,110
精华内容 1,244
关键字:

python图书管理系统gui

python 订阅