鱼C论坛

 找回密码
 立即注册
查看: 2393|回复: 7

[作品展示] 自制图书管理器

[复制链接]
发表于 2021-5-11 16:15:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
两年前学了两个星期的python,到现在重新拾起来,没想到大多数语法还记得!

四天前,偶然在网络上看到一个作业,说是要自制一个图书管理器,可以实现添加、删除、查找,还有借书和还书的功能。于是我就开干了,本来是说搞一个图形界面出来,但是对于我来说还是难了点,就想先从控制台应用开始。

这个小程序对中文输入法有一点点小冲突,但是不影响对中文书名操作的相关功能,如果有大佬可以帮我看看,如何解决这个烦人的问题,小的感激不尽。

这个程序用到了 keyboard 和 time  模块,keyboard请用在Windows命令行输入以下代码下载安装:
pip install keyboard

运行后的界面
2021-05-11_150826.png


程序在.py 文件的目录下,自动生成一个Bookinformation.txt 的文件,里面存储着书籍的相关数据。

文件已上传Github,链接:https://github.com/YouCam-X/Code

以下是源代码:
import keyboard
import time


bookinformation = []
bookinformation_number = 0

class Menu:
    #用于创建菜单界面
    def showmenu(self):
        while True:
            print('''欢迎来到图书管理系统,请按下对应的数字键选择功能:
                                 添加图书 —— 1
                                 查询图书 —— 2
                                 借阅\归还图书 —— 3
                                 删除图书 —— 4
                                 修改书籍信息 —— 5
                                 显示所有书籍 —— 6
                                 退出系统 —— 7''')
        
            while True:
                if keyboard.is_pressed('1'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    # buffer 的作用是为了解决按下 数字键 1 后会将1这个字符代入到后面的input()当中的冲突
                    Bookmanager.addbooks(self)
                    break

                elif keyboard.is_pressed('2'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    Bookmanager.searchbooks(self)
                    break
                
                elif keyboard.is_pressed('3'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    Bookmanager.borrow_return_books(self)
                    break

                elif keyboard.is_pressed('4'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    Bookmanager.deletebooks(self)
                    break

                elif keyboard.is_pressed('5'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    Bookmanager.editbooks(self)
                    break

                elif keyboard.is_pressed('6'):
                    buffer = input('请忽略本条信息,按回车键继续')
                    Bookmanager.showallbooks(self)
                    break

                elif keyboard.is_pressed('7'):
                    return

                else:
                    continue

class Bookmanager:
    
    def save(self):
        file = open('Bookinformation.txt','a+') 
        #因为要添加图书,所以用 a+ 方式打开, 也可以用 r+,但是指针的位置不一样,可能会影响后面的代码
        # w+ 的话就直接覆盖了,所以不行

        for book in bookinformation:
            for i in book:
                file.write(i)
                file.write('\t')
            file.write('\n')
        file.close()

    #一开始的思路是,一次连续输入所有信息,用tab键分隔,但是觉得麻烦
    #def addbooks(self):
    #    global bookinformation_number 
    #    global bookinformation

    #    while true:

    #            information = input('请依次输入书的名字、作者、类型、添加日期,以及备注(请用tab分隔不同的信息)\n')
    #            information += '\t'
    #            information_mediator = []
    #            one_information = ''
    #            information_array = []
    #            whether_to_execute = 0

    #            for i in information:
    #                if i == '\t':
    #                    whether_to_execute += 1

    #            if whether_to_execute >= 5:
    #                for character in information:

    #                    if character.encode() == '\t'.encode():
    #                        for character in information_mediator:
    #                            one_information += character
    #                        if one_information != '':
    #                            information_array.append(one_information)
    #                        one_information = ''
    #                        information_mediator = []

    #                    else:
    #                        information_mediator.append(character)

    #                name = information_array[0]
    #                author = information_array[1]
    #                genre = information_array[2]
    #                add_date = information_array[3]
    #                marker = information_array[4]

    #                del information_array[5:]

    #                bookinformation.append(information_array)
    #                bookinformation_number += 1

    #                print('''成功添加图书
    #                            新书名字是 %s
    #                            作者是 %s
    #                            类型是 %s
    #                            添加日期是 %s
    #                            备注是 %s'''%(name,author,genre,add_date,marker))

    #                print('如添加有误,请按f键;正确请按j键') 
                    
    #                while true:
    #                    if keyboard.is_pressed('f'):
    #                        del bookinformation[bookinformation_number-1]
    #                        print('已删除此信息,开始重新添加')
    #                        bookinformation_number -= 1
    #                        break

    #                    elif keyboard.is_pressed('j'):
    #                        break

    #                    else:
    #                        continue

    #                time.sleep(0.2)

    #                print('继续添加图书信息请按f键,退出请按j键')         
    #                while true:
    #                    if keyboard.is_pressed('f'):
    #                        break

    #                    elif keyboard.is_pressed('j'):
    #                        bookmanager.save(self)
    #                        bookinformation = []
    #                        bookinformation_number = 0
    #                        return

    #                    else:
    #                        continue

    #            else:   
    #                print('您的输入不完全或者有误,请重新输入')
    
    #            buffer = input('请忽略本行内容,继续敲击回车键')


    def addbooks(self):

        global bookinformation
        global bookinformation_number

        bookinformation_number = 0
        bookinformation = []

        while True:
            bookinformation_mediator = []

            name = input('请输入书名:')
            author = input('请输入作者:')
            genre = input('请输入所属类型:')
            marker = input('请输入备注:')
            date = time.strftime("%Y-%m-%d",time.localtime())
            #自动获取当天的日期,并添加至列表内
            availability = '可借阅'
            #默认的可用性是 可借阅

            bookinformation_mediator.append(name)
            bookinformation_mediator.append(author)
            bookinformation_mediator.append(genre)
            bookinformation_mediator.append(date)
            bookinformation_mediator.append(marker)
            bookinformation_mediator.append(availability)
            bookinformation.append(bookinformation_mediator)
            bookinformation_number += 1
            #bookinformation_number 在后面的添加有误后,删除的时候用到

            print('''添加成功!
                     书名是:%s
                     作者是:%s
                     题材是:%s
                     备注是:%s
                     添加日期是:%s'''%(name,author,genre,marker,date))


            keyboard.wait('enter',True,True)
            #这里的wait()是为了抵消上一个input()输入完成后按的回车键,不然会连着执行下面的 is_pressed('enter')的命令

            print('如添加的信息有误,请按Esc键,确认添加请按Enter键')


            #用 While True 死循环监测键盘输入
            while True:
                if keyboard.is_pressed('esc'):
                    del bookinformation[bookinformation_number-1]
                    print('此书信息已删除,请重新添加')
                    bookinformation_number -= 1
                    #删除之后要记得值减一
                    keyboard.wait('esc',True,True)
                    #wait()同理
                    break
                
                elif keyboard.is_pressed('enter'):
                    buffer = input('')
                    keyboard.wait('enter',True,True)
                    break

                else:
                    continue


            print('继续添加请按Enter键,退出请按Esc键')


            while True:
                if keyboard.is_pressed('enter'):
                    buffer = input('')
                    break

                elif keyboard.is_pressed('esc'):
                    Bookmanager.save(self)
                    bookinformation = []
                    bookinformation_number = 0
                    #退出前面要记得初始化两个变量
                    return

                else:
                    continue


    def searchbooks(self):
        global bookinformation

        while True:
            #初始化变量以防上次循环的变量也被拉进来
            bookinformation = []
            search_number = 0

            information_mediator = []
            one_information_item = ''
            file = open('Bookinformation.txt', 'r')
            #因为只是搜素书籍信息,所以不需要改动txt文件,用 r 方式打开就好
            book_list = file.readlines()
            # readlines()函数可以一行一行地读,并返回列表

            for i in book_list:
                for each_character in i:
                    if each_character == '\t' or each_character == '\n':
                        #保存的时候是用了Tab键来分隔不同的信息,用换行符来区分不同的书籍
                        if one_information_item != '' and one_information_item != '\n':
                            #防止将空字符串添加进列表
                            information_mediator.append(one_information_item)
                            one_information_item = ''
                            #添加完后需要初始化变量
                    else:
                        one_information_item += each_character

                bookinformation.append(information_mediator)
                information_mediator = []


            keywords = input('请输入需要查找的书名或者关键字\n')

            #这里搜索功能只能搜索到完全一样的关键字,编程能力不行,真希望可以像百度、谷歌那样

            for book in bookinformation:
                for i in book:
                    if i == keywords:
                        search_number += 1

                        print('''第%s本符合结果的书:
                                 书名:%s
                                 作者:%s
                                 类型:%s
                                 添加日期:%s
                                 备注:%s
                                 可用性:%s'''%(str(search_number),book[0],book[1],book[2],book[3],book[4],book[5]))
                        break
            
            if search_number == 0:
                print("找遍了也找不到这本书")

            print('是否继续查找,继续请按Enter键,退出查找请按Esc键')

            keyboard.wait('enter',True,True)

            while True:
                if keyboard.is_pressed('enter'):
                    break

                elif keyboard.is_pressed('esc'):
                    bookinformation = []
                    return
                    
                else:
                    continue
            
            buffer = input('')
            keyboard.wait('enter',True,True)

    def editbooks(self):

        global bookinformation

        while True:
            locate_number_list = []
            search_number = 0
            bookinformation = Bookmanager.get_bookinformation(self)
            
            keywords = input('请输入需要修改的书的关键字')
            keyboard.wait('enter',True,True)

            for book in bookinformation:
                
                for i in book:

                    if i == keywords:

                        search_number += 1
                        locate_number_list.append(book[6])

                        print('''第%s本符合结果的书:
                                 书名:%s
                                 作者:%s
                                 类型:%s
                                 添加日期:%s
                                 备注:%s
                                 可用性:%s'''%(str(search_number),book[0],book[1],book[2],book[3],book[4],book[5]))
                    
            if search_number == 0:

                print('没有找到这本书,请按Enter重新搜索。或者按Esc键退出')

                while True:

                    if keyboard.is_pressed('esc'):
                        keyboard.wait('esc',True,True)
                        return
                    
                    elif keyboard.is_pressed('enter'):
                        keyboard.wait('enter',True,True)
                        break

                    else:
                        continue

                continue

            book_number = Bookmanager.if_integer_is_valid(self)

            try:
                locate_book_number = locate_number_list[int(book_number)-1]
                book_mediator = bookinformation[int(locate_book_number)]

                availability = book_mediator[5]

                print('''确定要修改这本书吗?确定请按Enter键,取消请按Esc键。
                         书名:%s
                         作者:%s
                         类型:%s
                         添加日期:%s
                         备注:%s
                         可用性:%s'''%(book_mediator[0],book_mediator[1],book_mediator[2],book_mediator[3],book_mediator[4],book_mediator[5]))
                 

                while True:

                    if keyboard.is_pressed('enter'):

                        print('请重新输入信息:')

                        buffer = input('')

                        name = input('请输入书名:')
                        author = input('请输入作者:')
                        genre = input('请输入所属类型:')
                        marker = input('请输入备注:')
                        date = time.strftime("%Y-%m-%d",time.localtime())
                        
                        keyboard.wait('enter',True,True)

                        book_mediator = []
                        book_mediator.append(name)
                        book_mediator.append(author)
                        book_mediator.append(genre)
                        book_mediator.append(date)
                        book_mediator.append(marker)
                        book_mediator.append(availability)
                        book_mediator.append(str(locate_book_number))

                        del bookinformation[int(locate_book_number)]
                        bookinformation.insert(int(locate_book_number),book_mediator)

                        print('''修改完毕:
                                 新书名:%s
                                 新作者:%s
                                 新类型:%s
                                 新添加/修改日期:%s
                                 新备注:%s
                                 可用性:%s'''%(bookinformation[int(locate_book_number)][0],bookinformation[int(locate_book_number)][1],bookinformation[int(locate_book_number)][2],bookinformation[int(locate_book_number)][3],bookinformation[int(locate_book_number)][4],bookinformation[int(locate_book_number)][5]))

                        #修改完毕后就立即保存文件,可以避免一些Bugs
                        file = open('Bookinformation.txt','w+')

                        for book in bookinformation:
                            for i in book[:6]:
                                file.write(i)
                                file.write('\t')
                            file.write('\n')

                        file.close()

                        boobookinformation = []

                        break

                    elif keyboard.is_pressed('esc'):
                        keyboard.wait('esc',True,True)
                        bookinformation = []
                        break

                    else:
                        continue

            except:
                print('出错了!请输入正确的数字')
            
            print('继续修改请按Enter键,返回到主菜单请按Esc键')

            while True:

                if keyboard.is_pressed('enter'):
                    buffer = input('')
                    break

                elif keyboard.is_pressed('esc'):
                    return

                else:
                    continue

    def deletebooks(self):
        global bookinformation

        while True:
            locate_number_list = []
            search_number = 0
            bookinformation = Bookmanager.get_bookinformation(self)
            keywords = input('请输入需要删除的书的关键字')
            keyboard.wait('enter',True,True)

            for book in bookinformation:
                
                for i in book:

                    if i == keywords:

                        search_number += 1
                        locate_number_list.append(book[6])

                        print('''第%s本符合结果的书:
                                 书名:%s
                                 作者:%s
                                 类型:%s
                                 添加日期:%s
                                 备注:%s
                                 可用性:%s'''%(str(search_number),book[0],book[1],book[2],book[3],book[4],book[5]))
                    
            if search_number == 0:

                print('没有找到这本书,请按Enter重新搜索。或者按Esc键退出')

                while True:

                    if keyboard.is_pressed('esc'):
                        keyboard.wait('esc',True,True)
                        return
                    
                    elif keyboard.is_pressed('enter'):
                        keyboard.wait('enter',True,True)
                        break

                    else:
                        continue

                continue

            book_number = Bookmanager.if_integer_is_valid(self)

            try:

                book = bookinformation[int(locate_number_list[int(book_number)-1])]

                print('''确定要删除这本书吗?确定请按Enter键,取消请按Esc键
                          书名:%s
                          作者:%s
                          类型:%s
                          添加日期:%s
                          备注:%s
                          可用性:%s'''%(book[0],book[1],book[2],book[3],book[4],book[5]))
               
                while True:

                    if keyboard.is_pressed('enter'):
                        del bookinformation[int(locate_number_list[int(book_number)-1])]
                        file = open('Bookinformation.txt','w+')

                        for book in bookinformation:
                            for i in book[:6]:
                                file.write(i)
                                file.write('\t')
                            file.write('\n')
                        
                        file.close()

                        #删除后就立即保存

                        print('已成功删除!')
                        keyboard.wait('enter',True,True)
                        break

                    elif keyboard.is_pressed('esc'):
                        keyboard.wait('esc',True,True)
                        break

                    else:
                        continue

            except:
                print('请输入正确的数字!')

            print('继续删除请按Enter键,返回主菜单请按Esc键')


            while True:

                if keyboard.is_pressed('enter'):
                    keyboard.wait('enter',True,True)
                    break

                elif keyboard.is_pressed('esc'):
                    return

                else:
                    continue

    def borrow_return_books(self):
        global bookinformation

        while True:

            #循环运行每一次都要在开头初始化变量,以防对本次运行造成影响

            bookinformation = Bookmanager.get_bookinformation(self)
            search_number = 0
            locate_number_list = []

            keywords = input('请输入需要借阅/归还的书的关键字')
            keyboard.wait('enter',True,True)

            for book in bookinformation:
                for i in book:

                    if i == keywords:
                        search_number += 1
                        locate_number_list.append(book[6])

                        print('''符合条件的第%s本书:
                                 书名:%s
                                 作者:%s
                                 类型:%s
                                 添加日期:%s
                                 备注:%s
                                 可用性:%s'''%(str(search_number),book[0],book[1],book[2],book[3],book[4],book[5]))
                        break

            if search_number == 0:
                        
                print('找遍了也没找到!请按Enter键重新搜素,或者按Esc返回主菜单')

                while True:

                    if keyboard.is_pressed('enter'):
                        keyboard.wait('enter',True,True)
                        break
                    
                    elif keyboard.is_pressed('esc'):
                        return

                    else:
                        continue

            else:
                book_number = Bookmanager.if_integer_is_valid(self)

                try:
                    book = bookinformation[int(locate_number_list[int(book_number)-1])]

                    print('借阅此书请按Enter键,归还请按Esc键')

                    while True:

                        if keyboard.is_pressed('enter'):
                            keyboard.wait('enter',True,True)

                            #用条件句解决借阅归还时可能会出现的bugs

                            if book[5] == '可借阅':
                                print('借阅成功!')
                                del bookinformation[int(locate_number_list[int(book_number)-1])][5]
                                bookinformation[int(locate_number_list[int(book_number)-1])].insert(5,'已借出')

                                #同样借出去后需要修改可用性为已借出,并写在文件里

                                file = open('Bookinformation.txt','w')

                                for book in bookinformation:
                                    for i in book[:6]:

                                        file.write(i)
                                        file.write('\t')
                                    file.write('\n')

                                file.close()
                                break

                            else:
                                print('此书已被借走,无法借阅')
                                break

                        elif keyboard.is_pressed('esc'):
                            keyboard.wait('esc',True,True)

                            if book[5] == '已借出':
                                print('归还成功!')
                                del bookinformation[int(locate_number_list[int(book_number)-1])][5]
                                bookinformation[int(locate_number_list[int(book_number)-1])].insert(5,'可借阅')

                                file = open('Bookinformation.txt','w')

                                for book in bookinformation:
                                    for i in book[:6]:

                                        file.write(i)
                                        file.write('\t')
                                    file.write('\n')

                                file.close()
                                break

                            else:
                                print('此书还在库中,无需归还')
                                break

                        else:
                            continue

                except:
                    print('请输入正确的数字!')

                print('重新搜素请按Enter键,返回主菜单请按Esc键')

                while True:

                    if keyboard.is_pressed('enter'):
                        keyboard.wait('enter',True,True)
                        break

                    elif keyboard.is_pressed('esc'):
                        return

                    else:
                        continue

    def showallbooks(self):
        global bookinformation

        bookinformation = []
        search_number = 0
        bookinformation = Bookmanager.get_bookinformation(self)

        print('\n以下是在数据库里的全部书籍:\n')

        for book in bookinformation:

            search_number += 1

            print('''第%s本书:
                        书名:%s
                        作者:%s
                        类型:%s
                        添加日期:%s
                        备注:%s
                        可用性:%s \n'''%(str(search_number),book[0],book[1],book[2],book[3],book[4],book[5]))
        
        return
    

    #写了一个函数用来执行经常用到的功能,就不用一遍一遍地重复写相同的代码了
    def get_bookinformation(self):
        global bookinformation

        bookinformation = []
        search_number = 0
        locate_number = 0
        information_mediator = []
        one_information_item = ''

        file = open('Bookinformation.txt', 'r')
        book_list = file.readlines()
        file.close()

        for i in book_list:

            for each_character in i:

                if each_character == '\t':

                    if one_information_item != '' and one_information_item != '\n':

                        information_mediator.append(one_information_item)
                        one_information_item = ''

                elif each_character == '\n':
                    one_information_item = ''
                    information_mediator.append(str(locate_number))
                    #这里会将每一行的行号写入列表中,后面会用得到
                    locate_number += 1
                    break

                else:
                    one_information_item += each_character
                
            bookinformation.append(information_mediator)
            information_mediator = []
        
        #程序只需要bookinformation这个数组就行,其他的变量作为局部变量就可以
        return bookinformation
    

    #这个函数用来判断输入的序号合不合法
    def if_integer_is_valid(self):

        book_number = input('请问需要对第几本书进行操作?输入数字即可')

        while not str.isdigit(book_number):
            print('请确保输入的是整数序号')
            book_number = input('请问需要对第几本书进行操作?输入数字即可')

        while int(book_number) != float(book_number):
            print('请确保输入的是整数序号')
            book_number = input('请问需要对第几本书进行操作?输入数字即可')

        keyboard.wait('enter',True,True)

        return book_number

main = Menu()
main.showmenu()


评分

参与人数 2荣誉 +7 鱼币 +7 贡献 +3 收起 理由
亢一飞 + 5 + 5 + 3 鱼C有你更精彩^_^
yayc_zcyd + 2 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-5-12 06:08:43 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-5-13 10:21:28 | 显示全部楼层
么么,有人给个评价和建议吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-16 16:59:15 | 显示全部楼层
楼主辛苦了,撸的挺多的,也很实用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-17 10:03:07 | 显示全部楼层
亢一飞 发表于 2021-5-16 16:59
楼主辛苦了,撸的挺多的,也很实用

谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-17 20:16:05 | 显示全部楼层
支持楼主
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-5-25 20:32:41 | 显示全部楼层
可以可以 就是每当关闭程序的时候电脑会'死'一会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-27 16:16:31 | 显示全部楼层
tigerPython2019 发表于 2021-5-25 20:32
可以可以 就是每当关闭程序的时候电脑会'死'一会

哈哈哈!新手嘛,不懂怎么优化,过段时间做个图形界面出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-15 17:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表