张伟:李娜,最近我们学院在教材发放方面遇到了一些问题,特别是学生数量多了之后,手动发放效率太低了。你有没有什么好的解决方案?
李娜:是啊,我也注意到这个问题了。我觉得我们可以做一个简单的教材发放管理系统,用Python来开发,这样既方便又高效。
张伟:听起来不错,不过具体怎么实现呢?你有没有想过系统的结构?
李娜:我们可以先从数据库开始设计,用SQLite或者MySQL存储教材信息和学生信息。然后,再写一个简单的界面,让学生可以查询自己的教材情况。
张伟:那具体的数据表应该怎样设计呢?
李娜:比如,我们可以设计两个表:一个是教材表(books),包含教材ID、名称、作者、出版社、库存数量等字段;另一个是学生表(students),包含学生ID、姓名、班级、联系方式等信息。
张伟:明白了,那教材发放记录该怎么处理呢?
李娜:我们需要一个发放记录表(records),记录每本教材被哪个学生领取了,以及领取时间。这样就可以追踪每一本教材的去向。
张伟:那系统需要哪些功能模块呢?
李娜:主要有以下几个功能:1. 教材信息管理,包括添加、修改、删除教材;2. 学生信息管理;3. 教材发放功能,根据学生需求进行发放;4. 查询功能,可以按教材名或学生姓名查询发放记录。
张伟:那我们可以用Python的什么库来实现这些功能呢?
李娜:可以用sqlite3来操作数据库,然后用tkinter来创建图形用户界面。如果需要更复杂的界面,也可以考虑使用PyQt或者Tkinter。
张伟:那我先试试看用sqlite3做数据库吧。你能给我一个示例代码吗?
李娜:当然可以。下面是一个简单的数据库初始化代码,用于创建三个表:教材表、学生表和发放记录表。
import sqlite3
# 连接数据库
conn = sqlite3.connect('textbook.db')
cursor = conn.cursor()
# 创建教材表
cursor.execute('''
CREATE TABLE IF NOT EXISTS books (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
author TEXT,
publisher TEXT,
stock INTEGER
)
''')
# 创建学生表
cursor.execute('''
CREATE TABLE IF NOT EXISTS students (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
class TEXT,
contact TEXT
)
''')
# 创建发放记录表
cursor.execute('''
CREATE TABLE IF NOT EXISTS records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
student_id INTEGER,
book_id INTEGER,
issue_date DATE,
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (book_id) REFERENCES books(id)
)
''')
# 提交更改并关闭连接
conn.commit()
conn.close()
张伟:这个代码看起来挺清晰的,不过我还想看看如何添加教材信息。
李娜:好的,下面是添加教材信息的代码示例:
def add_book(name, author, publisher, stock):
conn = sqlite3.connect('textbook.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO books (name, author, publisher, stock) VALUES (?, ?, ?, ?)',
(name, author, publisher, stock))
conn.commit()
conn.close()
张伟:明白了,那如何查看所有教材呢?
李娜:可以写一个查询函数,如下所示:
def get_books():
conn = sqlite3.connect('textbook.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM books')
books = cursor.fetchall()
conn.close()
return books
张伟:这很实用。那学生信息呢?能不能也用类似的代码来管理?
李娜:当然可以,下面是添加学生的代码:
def add_student(name, class_name, contact):
conn = sqlite3.connect('textbook.db')
cursor = conn.cursor()
cursor.execute('INSERT INTO students (name, class, contact) VALUES (?, ?, ?)',
(name, class_name, contact))
conn.commit()
conn.close()
张伟:那发放教材的功能应该怎么实现呢?
李娜:发放教材时,需要检查教材是否有库存,然后更新库存,并记录发放信息。以下是发放教材的代码示例:
def issue_textbook(student_id, book_id):
conn = sqlite3.connect('textbook.db')
cursor = conn.cursor()
# 检查教材库存是否足够
cursor.execute('SELECT stock FROM books WHERE id = ?', (book_id,))
stock = cursor.fetchone()[0]
if stock <= 0:
print("该教材库存不足,无法发放!")
conn.close()
return False
# 更新库存
cursor.execute('UPDATE books SET stock = stock - 1 WHERE id = ?', (book_id,))
# 记录发放信息
cursor.execute('INSERT INTO records (student_id, book_id, issue_date) VALUES (?, ?, DATE("now"))',
(student_id, book_id))
conn.commit()
conn.close()
return True
张伟:这个逻辑非常清晰,看来我们可以用这个系统来管理教材发放了。
李娜:没错,而且这个系统还可以扩展,比如增加搜索功能、导出Excel报表等功能。
张伟:那我们现在可以试着运行一下这个系统,看看效果如何。
李娜:好,我们可以先测试一下添加教材和学生的信息,然后再尝试发放教材。
张伟:那我先试一下添加一本教材。
李娜:没问题,你可以用以下代码来测试:
add_book("操作系统原理", "王珊", "高等教育出版社", 10)
add_student("张三", "计算机科学与技术1班", "13800001111")
张伟:成功了!现在我再试试发放教材。
李娜:好的,执行以下代码:
issue_textbook(1, 1)
张伟:嗯,系统提示“发放成功”,看来一切正常。
李娜:是的,这说明我们的系统已经可以正常运行了。
张伟:那接下来是不是要考虑界面的问题?
李娜:对,我们可以用Tkinter来创建一个简单的图形界面,让用户更容易操作。
张伟:那我们可以设计一个窗口,里面有添加教材、添加学生、发放教材等按钮。
李娜:没错,我可以给你一个简单的界面代码作为参考。
import tkinter as tk
from tkinter import messagebox
def add_book_button():
name = entry_name.get()
author = entry_author.get()
publisher = entry_publisher.get()
stock = int(entry_stock.get())
add_book(name, author, publisher, stock)
messagebox.showinfo("成功", "教材已添加!")
def add_student_button():
name = entry_student_name.get()
class_name = entry_class.get()
contact = entry_contact.get()
add_student(name, class_name, contact)
messagebox.showinfo("成功", "学生信息已添加!")
def issue_textbook_button():
student_id = int(entry_student_id.get())
book_id = int(entry_book_id.get())
if issue_textbook(student_id, book_id):
messagebox.showinfo("成功", "教材已发放!")
else:
messagebox.showerror("错误", "教材库存不足或不存在!")
# 创建主窗口
root = tk.Tk()
root.title("教材发放管理系统")
# 添加教材输入框
label_name = tk.Label(root, text="教材名称:")
label_name.pack()
entry_name = tk.Entry(root)
entry_name.pack()
label_author = tk.Label(root, text="作者:")
label_author.pack()
entry_author = tk.Entry(root)
entry_author.pack()
label_publisher = tk.Label(root, text="出版社:")
label_publisher.pack()
entry_publisher = tk.Entry(root)
entry_publisher.pack()
label_stock = tk.Label(root, text="库存数量:")
label_stock.pack()
entry_stock = tk.Entry(root)
entry_stock.pack()
button_add_book = tk.Button(root, text="添加教材", command=add_book_button)
button_add_book.pack()
# 添加学生输入框
label_student_name = tk.Label(root, text="学生姓名:")

label_student_name.pack()
entry_student_name = tk.Entry(root)
entry_student_name.pack()
label_class = tk.Label(root, text="班级:")
label_class.pack()
entry_class = tk.Entry(root)
entry_class.pack()
label_contact = tk.Label(root, text="联系方式:")
label_contact.pack()
entry_contact = tk.Entry(root)
entry_contact.pack()
button_add_student = tk.Button(root, text="添加学生", command=add_student_button)
button_add_student.pack()
# 发放教材输入框
label_student_id = tk.Label(root, text="学生ID:")
label_student_id.pack()
entry_student_id = tk.Entry(root)
entry_student_id.pack()
label_book_id = tk.Label(root, text="教材ID:")
label_book_id.pack()
entry_book_id = tk.Entry(root)
entry_book_id.pack()
button_issue = tk.Button(root, text="发放教材", command=issue_textbook_button)
button_issue.pack()
root.mainloop()
张伟:这个界面看起来很直观,用户操作起来也很方便。
李娜:是的,虽然功能还比较简单,但已经能满足目前的需求了。未来我们可以继续优化,比如增加查询功能、统计报表等功能。
张伟:那这个系统就暂时完成了,感谢你的帮助!
李娜:不客气,希望这个系统能帮到你们学院的教材管理工作。
