20234014王逸天 2024-2025-2 《Python程序设计》实验四报告

20234014王逸天 2024-2025-2 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2341
姓名: 王逸天
学号: 20234104
实验教师:王志强
实验日期:2025年5月13日
必修/选修: 公选课

1.实验内容

综合运用tkinter库和sqlite3编写一个可视化的图书馆管理系统,包括书籍信息表,借阅信息表,能够实现插入图书、查询图书及借还书籍的功能,可以服务于有专职管理员的小型图书馆进行管理。

2.实验设计

  • 基于sqlite实现轻量化数据库管理系统搭建
    (1)创建数据库文件,并创建指针操作数据库
    (2)连接数据库,并写出图书信息表和借阅表两张表的sql语句
    (3)创建变量,写出查询语句
  • 使用tkinter实现可视化

3. 实验过程及结果

实验过程

每个def定义一个函数操作,形成一个模块,便于调用,每个函数具体作用详见下:

  • 使用import导入tkinter类库、sqlite

  • init_db函数用于创建数据库文件并初始化数据库
    使用conn方法链接数据库,使用excute方法执行sql语句
    使用commit提交方法提交上述所有sql语句,确保执行
    sql语句完成书籍信息表和借阅表创建
    具体表结构见下
    image

  • 添加图书模块:add_book()
    使用get方法获取用户输入在文本框中的字符串、
    连接到图书数据库文件并创建指针
    根据获取到的信息编写sql INSERT语句,插入图书信息到book表
    image

  • 查询模块:search_book()
    通过get方法获取用户输入在文本框中的字符串,并储存为变量keyword,使用if not实现异常处理
    链接数据库、创建指针,之后写出sql语句具体如下,综合使用LIKE子句和通配符%(任意字符)进行查询
    使用DELETE方法清空列表框,显示可借阅图书,并设定显示格式

  • 借阅功能函数:borrow_book()
    获取所选取列表框中的图书,并用if not实现异常处理
    获取图书信息、借阅人姓名
    检查图书状态,如果不可用则提示
    获取当前时间,插入借阅记录,更新图书状态
    断开数据库连接,并弹出成功提示

  • 归还图书return_book():同上

  • 清空文本框:使用的delete方法

  • GUI界面设计,具体内容见代码块

点击查看代码
#创建窗口,命名标题为简易图书管理系统
root = Tk()
root.title("简易图书馆管理系统")

#添加图书区域,新建三个输入型文本框,与变量相关,用row 和column设定大小,建立提交按钮,关联add——book函数
Label(root, text="书名").grid(row=0, column=0)
entry_title = Entry(root)
entry_title.grid(row=0, column=1)

Label(root, text="作者").grid(row=1, column=0)
entry_author = Entry(root)
entry_author.grid(row=1, column=1)

Label(root, text="ISBN").grid(row=2, column=0)
entry_isbn = Entry(root)
entry_isbn.grid(row=2, column=1)

Button(root, text="添加图书", command=add_book).grid(row=3, column=0, columnspan=2, pady=5)

#搜索功能,使用到的方法同上
Label(root, text="搜索图书/作者/ISBN").grid(row=4, column=0)
entry_search = Entry(root)
entry_search.grid(row=4, column=1)
Button(root, text="搜索", command=search_books).grid(row=5, column=0, columnspan=2, pady=5)

#列表框
listbox_books = Listbox(root, width=80)
listbox_books.grid(row=6, column=0, columnspan=2)

#借阅归还功能
Label(root, text="借阅人姓名").grid(row=7, column=0)
entry_borrower = Entry(root)
entry_borrower.grid(row=7, column=1)

Button(root, text="借阅", command=borrow_book).grid(row=8, column=0, pady=5)
Button(root, text="归还", command=return_book).grid(row=8, column=1, pady=5)

#结束循环
root.mainloop()

实验结果完整代码具体如下:

点击查看代码
import sqlite3
from tkinter import *
from tkinter import messagebox
from datetime import datetime


def init_db():
    conn = sqlite3.connect('library.db')
    c = conn.cursor()
    c.execute('''CREATE TABLE IF NOT EXISTS books (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                title TEXT,
                author TEXT,
                isbn TEXT,
                available BOOLEAN DEFAULT 1)''')

    c.execute('''CREATE TABLE IF NOT EXISTS borrow_records (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                book_id INTEGER,
                borrower TEXT,
                borrow_date TEXT,
                return_date TEXT,
                FOREIGN KEY(book_id) REFERENCES books(id))''')
    conn.commit()
    conn.close()

init_db()


def add_book():
    title = entry_title.get()
    author = entry_author.get()
    isbn = entry_isbn.get()

    if not title or not author or not isbn:
        messagebox.showwarning("输入错误", "请填写所有字段")
        return

    conn = sqlite3.connect('library.db')
    c = conn.cursor()
    c.execute("INSERT INTO books (title, author, isbn) VALUES (?, ?, ?)",
              (title, author, isbn))
    conn.commit()
    conn.close()
    messagebox.showinfo("成功", "图书已添加")
    clear_entries()


def search_books():
    keyword = entry_search.get()
    if not keyword:
        messagebox.showwarning("输入错误", "请输入搜索关键词")
        return

    conn = sqlite3.connect('library.db')
    c = conn.cursor()
    c.execute("SELECT * FROM books WHERE title LIKE ? OR author LIKE ? OR isbn LIKE ?",
              ('%' + keyword + '%', '%' + keyword + '%', '%' + keyword + '%'))
    rows = c.fetchall()
    conn.close()

    listbox_books.delete(0, END)
    for row in rows:
        status = "可借" if row[4] else "已借出"
        listbox_books.insert(END, f"{row[0]} - {row[1]} - {row[2]} - {row[3]} - {status}")


def borrow_book():
    selected = listbox_books.curselection()
    if not selected:
        messagebox.showwarning("选择错误", "请选择一本图书")
        return
    book_info = listbox_books.get(selected[0])
    book_id = int(book_info.split(" - ")[0])

    borrower = entry_borrower.get()
    if not borrower:
        messagebox.showwarning("输入错误", "请输入借阅人姓名")
        return

    conn = sqlite3.connect('library.db')
    c = conn.cursor()
    c.execute("SELECT available FROM books WHERE id=?", (book_id,))
    available = c.fetchone()[0]

    if not available:
        messagebox.showwarning("错误", "此书已被借出")
        return

    borrow_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    c.execute("INSERT INTO borrow_records (book_id, borrower, borrow_date) VALUES (?, ?, ?)",
              (book_id, borrower, borrow_date))
    c.execute("UPDATE books SET available=0 WHERE id=?", (book_id,))
    conn.commit()
    conn.close()
    messagebox.showinfo("成功", "图书已借出")
    search_books()
    entry_borrower.delete(0, END)


def return_book():
    selected = listbox_books.curselection()
    if not selected:
        messagebox.showwarning("选择错误", "请选择一本图书")
        return
    book_info = listbox_books.get(selected[0])
    book_id = int(book_info.split(" - ")[0])

    conn = sqlite3.connect('library.db')
    c = conn.cursor()
    c.execute("SELECT available FROM books WHERE id=?", (book_id,))
    available = c.fetchone()[0]

    if available:
        messagebox.showwarning("错误", "此书未被借出")
        return

    return_date = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    c.execute("UPDATE borrow_records SET return_date=? WHERE book_id=? AND return_date IS NULL",
              (return_date, book_id))
    c.execute("UPDATE books SET available=1 WHERE id=?", (book_id,))
    conn.commit()
    conn.close()
    messagebox.showinfo("成功", "图书已归还")
    search_books()


def clear_entries():
    entry_title.delete(0, END)
    entry_author.delete(0, END)
    entry_isbn.delete(0, END)


root = Tk()
root.title("简易图书馆管理系统")

Label(root, text="书名").grid(row=0, column=0)
entry_title = Entry(root)
entry_title.grid(row=0, column=1)

Label(root, text="作者").grid(row=1, column=0)
entry_author = Entry(root)
entry_author.grid(row=1, column=1)

Label(root, text="ISBN").grid(row=2, column=0)
entry_isbn = Entry(root)
entry_isbn.grid(row=2, column=1)

Button(root, text="添加图书", command=add_book).grid(row=3, column=0, columnspan=2, pady=5)

Label(root, text="搜索图书/作者/ISBN").grid(row=4, column=0)
entry_search = Entry(root)
entry_search.grid(row=4, column=1)
Button(root, text="搜索", command=search_books).grid(row=5, column=0, columnspan=2, pady=5)

listbox_books = Listbox(root, width=80)
listbox_books.grid(row=6, column=0, columnspan=2)

Label(root, text="借阅人姓名").grid(row=7, column=0)
entry_borrower = Entry(root)
entry_borrower.grid(row=7, column=1)

Button(root, text="借阅", command=borrow_book).grid(row=8, column=0, pady=5)
Button(root, text="归还", command=return_book).grid(row=8, column=1, pady=5)

root.mainloop()

验证截图如下:


image

其他(感悟、思考等)

通过本学期的Python课程学习,我从零开始掌握了编程的基本技能。最大的收获是理解了计算机如何执行指令,以及如何用代码解决实际问题。
课程中我学会了:
1.基础编程能力:掌握了变量、循环、条件判断等核心概念,能够编写实2.现基本功能的程序
3.数据处理方法:学会了使用列表、字典存储信息,用文件读写保存数据
4.实用开发技能:通过图书馆管理系统项目,实践了完整开发流程:
5.设计程序结构

特别有成就感的是完成了期末项目。虽然过程中遇到了不少问题,比如调试数据库连接错误、解决界面显示异常等,但通过查阅资料和反复尝试都成功解决了。这让我体会到编程需要耐心和细致。

通过本次实验,我充分体验到了python作为模块化编程软件的优势,内置的类库可以非常方便的实现各种综合功能,简单可用的各种方法可以在极低的学习成本之下实现较为复杂的功能。

通过定义不同函数,即使部分功能出现问题,其他功能仍可以正常使用。

老师讲解清晰,示例贴近实际生活,让我明白编程不是抽象的理论,而是能解决真实问题的工具。课堂练习和项目实践相结合的方式特别有效,每次完成一个小功能都很有成就感。

感谢老师的悉心指导,这门课让我获得了实用的编程能力,也增强了解决问题的信心。

posted @ 2025-06-06 17:01  念水0518  阅读(9)  评论(0)    收藏  举报