最近学校数据库原理结课,需要做一个大作业,还要求写图形化界面,现在分享我的源码,有很多不足之处我也懒的改了,给大家参考一下

具体要实现的功能为图书,读者信息的增删查改,借书还书触发器更改实时库存,超时罚款缴纳等下面是我的sql代码和python代码

图书信息(book_information):图书编号(book_id),图书名(book_name),作者(author),类别(book_category),出版社(publisher),图书总数( book_total)
读者信息表(reader_information):读者编号(reader_id),姓名(reader_name),所在班级(reader_class),读者类别(reader_category),该类别读者可借阅册数(reader_borrowednumber),
图书库存表(book_inventory):图书编号(book_id),剩余库存数(book_surplus)
读者缴费表(reader_payment):读者编号(reader_id),待缴罚款(reader_fine)
读者借书表(reader_borrow):读者编号(borrow_id),所借书籍名称(borrow_bookname)借书时间(borrow_date)
读者还书表(reader_back):读者编号(back_id),所还书籍名称(back_bookname),还书时间(back_date)

CREATE TABLE book_information (book_id INT PRIMARY KEY,book_name NVARCHAR(50) NOT NULL,author NVARCHAR(100) NOT NULL,book_category NVARCHAR(50),publisher NVARCHAR(50),book_total int )--图书信息表create table reader_information(reader_id INT PRIMARY KEY,reader_name NVARCHAR(50) NOT NULL,reader_class int NOT NULL,reader_category NVARCHAR(50)not null,reader_borrowednumber int not null)--读者信息表create table book_inventory(book_id INT PRIMARY KEY,book_surplus int NOT NULL,)--图书库存表create table reader_payment(reader_id varchar(20) PRIMARY KEY,reader_fine int NOT NULL,)--读者罚款表create table reader_borrow(borrow_id NVARCHAR(50), --为了比较成功运行触发器,borrow_id为借书人的名字borrow_bookname NVARCHAR(50) NOT NULL,borrow_date date ,)--读者借书表create table reader_back(back_id NVARCHAR(50), --为了比较成功运行触发器,borrow_id为借书人的名字back_bookname NVARCHAR(50) NOT NULL,back_date date ,)--读者还书表create view book_select(书号,书名,总数,在馆册数)--图书信息查看视图as select book_information.book_id,book_information.book_name,book_information.book_total,book_inventory.book_surplusfrom book_inventory,book_informationwhere book_inventory.book_id=book_information.book_idcreate trigger tri_jieshu on reader_borrow --借书触发器更改库存for insertasdeclare @id varchar(50)select @id=borrow_id from insertedupdate book_borrowing set book_surplus=book_surplus-1where book_id=@idcreate trigger tri_huanshu on reader_back --还书触发器更改库存for insertasdeclare @id varchar(50)select @id=back_id from insertedupdate book_borrowing set book_surplus=book_surplus+1where book_id=@id--借书还书存储过程返回借书日期和还书日期,返回值用列表的两个值相减得出超时天数计算罚款值,交罚款的时候先插入还书记录。获取还书时间,还书表和借书表连接创建视图,如果还书时间减借书日期大于7,选中这个人,create proc payment @id varchar(20),@name varchar(20)as beginselect borrow_date,back_date from reader_back,reader_borrow where back_id=borrow_id and back_id=@id and borrow_bookname=back_bookname and (select datediff(day, borrow_date,back_date) FROM reader_back,reader_borrow)>7 end--连接借书还书表创建视图create view view_pay as select * from reader_back,reader_borrow where (borrow_id=back_id and borrow_bookname=back_bookname)--创建存储过程通过传入参数id找到他的借书记录create proc proc_pay (@id varchar(20))asselect back_id,back_bookname,back_date,borrow_date from view_paywhere back_id=@idexec proc_pay@id='1'
import tkinter as tkfrom tkinter import messagebox# import this to fix messagebox errorfrom tkinter import StringVarimport pickleimport pymssqlimport datetimedef conn():serverName = '127.0.0.1'#目的主机ip地址userName = 'sa'#SQL Server身份账号passWord = '1234567'#SQL Server身份密码dbName = 'classwork'#对应数据库名称# dbName = 'teach'#对应数据库名称connect = pymssql.connect(server = serverName , database = dbName,charset='utf8') #Window默认身份验证建立连接return connectconn=conn()cursor=conn.cursor()def menu():menu1 = tk.Tk()menu1.title('图书管理系统')menu1.geometry('700x400')l = tk.Label(menu1, text='你好!欢迎使用图书管理系统', bg='green', font=('Arial', 12), width=30, height=2)l.pack()var = tk.StringVar()# 将label标签的内容设置为字符类型,用var来接收hit_me函数的传出内容用以显示在标签上function1 = tk.Button(menu1, text='1.图书信息管理', font=('Arial', 12), width=15, height=1, command=fun1,)function1.pack(expand=True)function2 = tk.Button(menu1, text='2.读者信息管理', font=('Arial', 12), width=15, height=1, command=fun2)function2.pack(expand=True)function3 = tk.Button(menu1, text='3.图书借阅管理', font=('Arial', 12), width=15, height=1, command=fun3)function3.pack(expand=True)function4 = tk.Button(menu1, text='4.超时罚款缴纳', font=('Arial', 12), width=15, height=1, command=fun4)function4.pack(expand=True)function5 = tk.Button(menu1, text='5.信息查询', font=('Arial', 12), width=15, height=1, command=fun5)function5.pack(expand=True)menu1.mainloop()def fun1():root1 = tk.Tk()root1.title('图书信息管理')root1.geometry('700x400')root1_1 =tk.Button(root1,text='图书信息增加',font=('Arial', 12),width=15, height=1,command=lambda:root1_1_x(root1))root1_1.pack(expand=True)root1_2 =tk.Button(root1,text='图书信息删除',font=('Arial', 12),width=15, height=1,command=lambda:root1_2_x(root1))root1_2.pack(expand=True)root1_3 =tk.Button(root1,text='图书信息更新',font=('Arial', 12),width=15, height=1,command=lambda:root1_3_x(root1))root1_3.pack(expand=True)root1.mainloop()def root1_1_x(self):self.destroy()def add_book(): cursor.execute(("INSERT INTO book_information VALUES ('" + entry_1.get() + "','" + entry_2.get() + "','" + entry_3.get() + "','" + entry_4.get() + "','" + entry_5.get() + "','" + entry_6.get() + "')")) conn.commit() conn.rollback() tk.messagebox.showinfo(title="提示", message="图书增加成功") root1_1_1.destroy()def back():root1_1_1.destroy()root1_1_1=tk.Tk()root1_1_1.title('图书信息增加')root1_1_1.geometry('700x400')tk.Label(root1_1_1,text='输入图书编号:',).place(x=220,y=50)entry_1=tk.Entry(root1_1_1,)entry_1.place(x=350, y=50)tk.Label(root1_1_1,text='输入图书名称:',).place(x=220,y=80)entry_2=tk.Entry(root1_1_1,)entry_2.place(x=350, y=80)tk.Label(root1_1_1,text='输入作者名称:',).place(x=220,y=110)entry_3=tk.Entry(root1_1_1,)entry_3.place(x=350, y=110)tk.Label(root1_1_1,text='输入图书类别:',).place(x=220,y=140)entry_4=tk.Entry(root1_1_1,)entry_4.place(x=350, y=140)tk.Label(root1_1_1,text='输入图书出版社名称:',).place(x=220,y=170)entry_5=tk.Entry(root1_1_1,)entry_5.place(x=350, y=170)tk.Label(root1_1_1,text='请输入图书总数:',).place(x=220,y=200)entry_6=tk.Entry(root1_1_1,)entry_6.place(x=350, y=200)button1 =tk.Button(root1_1_1,text='确定',command=add_book).place(x=220,y=230)button2 =tk.Button(root1_1_1,text='返回',command=back).place(x=350,y=230)root1_1_1.mainloop()def root1_2_x(self):self.destroy()root1_2_1=tk.Tk()root1_2_1.title('图书信息删除')root1_2_1.geometry('700x400')tk.Label(root1_2_1,text='输入图书编号:',).place(x=220,y=50)entry_1=tk.Entry(root1_2_1,)entry_1.place(x=350, y=50)tk.Label(root1_2_1,text='输入图书名称:',).place(x=220,y=80)entry_2=tk.Entry(root1_2_1,)entry_2.place(x=350, y=80)def del_book():cursor.execute("select * from book_information where book_id='"+ entry_1.get() +"'and book_name = '" + entry_2.get() +"' ")a=cursor.fetchall()if len(a) !=0:cursor.execute(("delete from book_information where book_id='"+ entry_1.get() +"'and book_name = '" + entry_2.get() +"'"))conn.commit()conn.rollback()tk.messagebox.showinfo(title="提示", message="图书删除成功")root1_2_1.destroy()else:tk.messagebox.showerror(title='提示', message="未找到此书",)root1_2_1.destroy()def back():root1_2_1.destroy()button1 =tk.Button(root1_2_1,text='确定',command=del_book).place(x=220,y=230)button2 =tk.Button(root1_2_1,text='返回',command=back).place(x=350,y=230)def root1_3_x(self):self.destroy()root1_3_1=tk.Tk()root1_3_1.title('图书信息更新')root1_3_1.geometry('700x400')root1=tk.Button(root1_3_1,text='以图书编号更改',command=lambda:root1_3_x_1(root1_3_1))root1.pack(expand=True)root2=tk.Button(root1_3_1,text='以图书名称更改',command=lambda:root1_3_x_2(root1_3_1))root2.pack(expand=True)def root1_3_x_1(self):#以图书编号更新self.destroy()root1_3_2 = tk.Toplevel()root1_3_2.title('以图书编号更改')root1_3_2.geometry('700x400')lab1=tk.Label(root1_3_2, text='输入图书编号:' )lab1.place(x=220, y=50)entry_a = tk.Entry(root1_3_2)entry_a.place(x=350, y=50)but1= tk.Button(root1_3_2, text='确定', command=lambda: root1_3_x_1_1(root1_3_2))but1.place(x=220,y=80)but2 =tk.Button(root1_3_2, text='返回', command=lambda: root1_3_x_1_2(root1_3_2))but2.place(x=400,y=80)def root1_3_x_1_1(self):#获取图书信息并进行更改写入数据库cursor.execute("select * from book_information where book_id='" + entry_a.get() + "' ")a = cursor.fetchall()conn.commit()conn.rollback()if len(a) == 0:return_value = tk.messagebox.showerror('提示','未找到此书')print(type(return_value), return_value)root1_3_2.destroy()else:#查询到图书信息并输出,用文本框获取输入的值root1_3_3 = tk.Tk()root1_3_3.title('以图书编号更改')root1_3_3.geometry('700x400')tk.Label(root1_3_3, text='查询到此图书信息为', ).place(x=150, y=80)tk.Label(root1_3_3, text='请在下列输入框中输入您要更新的图书信息', ).place(x=400, y=80)tk.Label(root1_3_3, text='图书编号', ).place(x=150, y=100)tk.Label(root1_3_3, text=a[0][0], ).place(x=250, y=100)tk.Label(root1_3_3, text=a[0][0], ).place(x=400, y=100)tk.Label(root1_3_3, text='图书名称', ).place(x=150, y=120)tk.Label(root1_3_3, text=a[0][1], ).place(x=250, y=120)entry_2 = tk.Entry(root1_3_3, )entry_2.place(x=400, y=120)tk.Label(root1_3_3, text='作者名称', ).place(x=150, y=140)tk.Label(root1_3_3, text=a[0][2], ).place(x=250, y=140)entry_3 = tk.Entry(root1_3_3, )entry_3.place(x=400, y=140)tk.Label(root1_3_3, text='图书类别', ).place(x=150, y=160)tk.Label(root1_3_3, text=a[0][3], ).place(x=250, y=160)entry_4 = tk.Entry(root1_3_3, )entry_4.place(x=400, y=160)tk.Label(root1_3_3, text='图书出版社名称', ).place(x=150, y=180)tk.Label(root1_3_3, text=a[0][4], ).place(x=250, y=180)entry_5 = tk.Entry(root1_3_3, )entry_5.place(x=400, y=180)tk.Label(root1_3_3, text='图书总数', ).place(x=150, y=200)tk.Label(root1_3_3, text=a[0][5], ).place(x=250, y=200)entry_6 = tk.Entry(root1_3_3, )entry_6.place(x=400, y=200)but3 = tk.Button(root1_3_3, text='确定', command=lambda: root1_3_x_1_2(root1_3_3)).place(x=250,y=250)but4 = tk.Button(root1_3_3, text='返回', command=lambda: back(root1_3_3)).place(x=400,y=250)def root1_3_x_1_2(self):#确认按钮执行数据的写入#cursor.execute("select * from book_information where book_id='1'")cursor.execute("update book_information set book_name ='" + entry_2.get() + "', author='" + entry_3.get() + "',book_category='" + entry_4.get() + "',publisher='" + entry_5.get() + "',book_total='" + entry_6.get() + "' where book_id='" + entry_a.get() + "' ")#c = cursor.fetchall()#print(c[0][1])#cursor.execute("update book_information set book_name='%s',author='%s',book_category='%s',publisher='%s',book_total='%s' where book_id ='1' ") %(entry_2.get(),entry_3.get(),entry_4.get(),entry_5.get(),entry_6.get())conn.commit()conn.rollback()self.destroy()tk.messagebox.showinfo(title="提示", message="图书更新成功")def back(self):self.destroy()root1_3_3.mainloop()def root1_3_x_1_2(self):#返回按钮self.destroy()def root1_3_x_2(self):#以图书名称更新图书信息self.destroy()root1_3_3 = tk.Toplevel()root1_3_3.title('以图书名称更改')root1_3_3.geometry('700x400')lab1 = tk.Label(root1_3_3, text='输入图书名称:')lab1.place(x=220, y=50)entry_a = tk.Entry(root1_3_3)entry_a.place(x=350, y=50)print(entry_a.get())but1 = tk.Button(root1_3_3, text='确定', command=lambda: root1_3_x_1_2(root1_3_3))but1.place(x=220, y=80)but2 = tk.Button(root1_3_3, text='返回', command=lambda: back(root1_3_3))but2.place(x=400, y=80)def back(self):self.destroy()def root1_3_x_1_2(self):#获取读者信息并进行更改写入数据库cursor.execute("select * from book_information where book_name='" + entry_a.get() + "' ")a = cursor.fetchall()conn.commit()conn.rollback()if len(a) == 0:return_value = tk.messagebox.showerror('提示','未找到此书')print(type(return_value), return_value)root1_3_3.destroy()else:#查询到图书信息并输出,用文本框获取输入的值root1_3_4 = tk.Tk()root1_3_4.title('以图书名称更改')root1_3_4.geometry('700x400')tk.Label(root1_3_4, text='查询到此图书信息为', ).place(x=150, y=80)tk.Label(root1_3_4, text='请在下列输入框中输入您要更新的图书信息', ).place(x=400, y=80)tk.Label(root1_3_4, text='图书名称', ).place(x=150, y=100)tk.Label(root1_3_4, text=a[0][0], ).place(x=250, y=100)tk.Label(root1_3_4, text=a[0][0], ).place(x=400, y=100)tk.Label(root1_3_4, text='图书编号', ).place(x=150, y=120)tk.Label(root1_3_4, text=a[0][1], ).place(x=250, y=120)entry_2 = tk.Entry(root1_3_4, )entry_2.place(x=400, y=120)tk.Label(root1_3_4, text='作者名称', ).place(x=150, y=140)tk.Label(root1_3_4, text=a[0][2], ).place(x=250, y=140)entry_3 = tk.Entry(root1_3_4, )entry_3.place(x=400, y=140)tk.Label(root1_3_4, text='图书类别', ).place(x=150, y=160)tk.Label(root1_3_4, text=a[0][3], ).place(x=250, y=160)entry_4 = tk.Entry(root1_3_4, )entry_4.place(x=400, y=160)tk.Label(root1_3_4, text='图书出版社名称', ).place(x=150, y=180)tk.Label(root1_3_4, text=a[0][4], ).place(x=250, y=180)entry_5 = tk.Entry(root1_3_4, )entry_5.place(x=400, y=180)tk.Label(root1_3_4, text='图书总数', ).place(x=150, y=200)tk.Label(root1_3_4, text=a[0][5], ).place(x=250, y=200)entry_6 = tk.Entry(root1_3_4, )entry_6.place(x=400, y=200)but3 = tk.Button(root1_3_4, text='确定', command=lambda: root1_3_x_1_3(root1_3_4)).place(x=250,y=250)but4 = tk.Button(root1_3_4, text='返回', command=lambda: back(root1_3_4)).place(x=400,y=250)def root1_3_x_1_3(self):#确认按钮执行数据的写入#cursor.execute("select * from book_information where book_id='1'")cursor.execute("update book_information set book_id ='" + entry_2.get() + "', author='" + entry_3.get() + "',book_category='" + entry_4.get() + "',publisher='" + entry_5.get() + "',book_total='" + entry_6.get() + "' where book_name='" + entry_a.get() + "' ")#c = cursor.fetchall()#print(c[0][1])#cursor.execute("update book_information set book_name='%s',author='%s',book_category='%s',publisher='%s',book_total='%s' where book_id ='1' ") %(entry_2.get(),entry_3.get(),entry_4.get(),entry_5.get(),entry_6.get())conn.commit()conn.rollback()self.destroy()tk.messagebox.showinfo(title="提示", message="图书更新成功")root1_3_3.destroy()root1_3_4.mainloop()def fun2():root2 = tk.Tk()root2.title('读者信息管理')root2.geometry('700x400')root2_1 =tk.Button(root2,text='读者信息增加',font=('Arial', 12),width=15, height=1,command=lambda:root2_1_x(root2))root2_1.pack(expand=True)root2_2 =tk.Button(root2,text='读者信息删除',font=('Arial', 12),width=15, height=1,command=lambda:root2_2_x(root2))root2_2.pack(expand=True)root2_3 =tk.Button(root2,text='读者信息更新',font=('Arial', 12),width=15, height=1,command=lambda:root2_3_x(root2))root2_3.pack(expand=True)def root2_1_x(self):#增加读者信息界面self.destroy()def add_reader(): cursor.execute(("INSERT INTO reader_information VALUES ('" + entry_1.get() + "','" + entry_2.get() + "','" + entry_3.get() + "','" + entry_4.get() + "','" + entry_5.get() + "')")) conn.commit() conn.rollback() tk.messagebox.showinfo(title="提示", message="读者增加成功") root2_1_1.destroy()def back():root2_1_1.destroy()root2_1_1=tk.Tk()root2_1_1.title('读者信息增加')root2_1_1.geometry('700x400')tk.Label(root2_1_1,text='输入读者编号:',).place(x=220,y=50)entry_1=tk.Entry(root2_1_1,)entry_1.place(x=350, y=50)tk.Label(root2_1_1,text='输入读者名称:',).place(x=220,y=80)entry_2=tk.Entry(root2_1_1,)entry_2.place(x=350, y=80)tk.Label(root2_1_1,text='输入读者班级:',).place(x=220,y=110)entry_3=tk.Entry(root2_1_1,)entry_3.place(x=350, y=110)tk.Label(root2_1_1,text='输入读者类别:',).place(x=220,y=140)entry_4=tk.Entry(root2_1_1,)entry_4.place(x=350, y=140)tk.Label(root2_1_1,text='输入可借阅最大书籍数:',).place(x=220,y=170)entry_5=tk.Entry(root2_1_1,)entry_5.place(x=350, y=170)button1 =tk.Button(root2_1_1,text='确定',command=add_reader).place(x=220,y=230)button2 =tk.Button(root2_1_1,text='返回',command=back).place(x=350,y=230)root2_1_1.mainloop()def root2_2_x(self):#删除读者信息界面self.destroy()root2_2_1=tk.Tk()root2_2_1.title('读者信息删除')root2_2_1.geometry('700x400')tk.Label(root2_2_1,text='输入读者编号:',).place(x=220,y=50)entry_1=tk.Entry(root2_2_1,)entry_1.place(x=350, y=50)tk.Label(root2_2_1,text='输入读者名称:',).place(x=220,y=80)entry_2=tk.Entry(root2_2_1,)entry_2.place(x=350, y=80)def del_reader():cursor.execute("select * from reader_information where reader_id='"+ entry_1.get() +"'and reader_name = '" + entry_2.get() +"' ")a=cursor.fetchall()if len(a) !=0:cursor.execute(("delete from reader_information where reader_id='"+ entry_1.get() +"'and reader_name = '" + entry_2.get() +"'"))conn.commit()conn.rollback()tk.messagebox.showinfo(title="提示", message="读者删除成功")root2_2_1.destroy()else:tk.messagebox.showerror(title='提示', message="未找到此读者")root2_2_1.destroy()def back():root2_2_1.destroy()button1 =tk.Button(root2_2_1,text='确定',command=del_reader).place(x=220,y=230)button2 =tk.Button(root2_2_1,text='返回',command=back).place(x=350,y=230)def root2_3_x(self):#更新读者信息界面self.destroy()root2_3_1 = tk.Tk()root2_3_1.title('读者信息更新')root2_3_1.geometry('700x400')root1 = tk.Button(root2_3_1, text='以读者编号更改', command=lambda: root2_3_x_1(root2_3_1))root1.pack(expand=True)root2 = tk.Button(root2_3_1, text='以读者名称更改', command=lambda: root2_3_x_2(root2_3_1))root2.pack(expand=True)def root2_3_x_1(self):# 以读者编号更新self.destroy()root2_3_2 = tk.Toplevel()root2_3_2.title('以读者编号更改')root2_3_2.geometry('700x400')lab1 = tk.Label(root2_3_2, text='输入读者编号:')lab1.place(x=220, y=50)entry_a = tk.Entry(root2_3_2)entry_a.place(x=350, y=50)but1 = tk.Button(root2_3_2, text='确定', command=lambda: root2_3_x_1_1(root2_3_2))but1.place(x=220, y=80)but2 = tk.Button(root2_3_2, text='返回', command=lambda: root2_3_x_1_2(root2_3_2))but2.place(x=400, y=80)def root2_3_x_1_1(self):# 获取读者信息并进行更改写入数据库cursor.execute("select * from reader_information where reader_id='" + entry_a.get() + "' ")a = cursor.fetchall()conn.commit()conn.rollback()self.destroy()if len(a) == 0:return_value = tk.messagebox.showerror('提示', '未找到读者')print(type(return_value), return_value)root2_3_2.destroy()else:# 查询到读者信息并输出,用文本框获取输入的值root2_3_3 = tk.Tk()root2_3_3.title('以读者编号更改')root2_3_3.geometry('700x400')tk.Label(root2_3_3, text='查询到此读者信息为', ).place(x=150, y=80)tk.Label(root2_3_3, text='请在下列输入框中输入您要更新的读者信息', ).place(x=400, y=80)tk.Label(root2_3_3, text='读者编号', ).place(x=150, y=100)tk.Label(root2_3_3, text=a[0][0], ).place(x=250, y=100)tk.Label(root2_3_3, text=a[0][0], ).place(x=400, y=100)tk.Label(root2_3_3, text='读者名称', ).place(x=150, y=120)tk.Label(root2_3_3, text=a[0][1], ).place(x=250, y=120)entry_2 = tk.Entry(root2_3_3, )entry_2.place(x=400, y=120)tk.Label(root2_3_3, text='读者班级', ).place(x=150, y=140)tk.Label(root2_3_3, text=a[0][2], ).place(x=250, y=140)entry_3 = tk.Entry(root2_3_3, )entry_3.place(x=400, y=140)tk.Label(root2_3_3, text='读者类别', ).place(x=150, y=160)tk.Label(root2_3_3, text=a[0][3], ).place(x=250, y=160)entry_4 = tk.Entry(root2_3_3, )entry_4.place(x=400, y=160)tk.Label(root2_3_3, text='读者最大借阅数', ).place(x=150, y=180)tk.Label(root2_3_3, text=a[0][4], ).place(x=250, y=180)entry_5 = tk.Entry(root2_3_3, )entry_5.place(x=400, y=180)but3 = tk.Button(root2_3_3, text='确定', command=lambda: root2_3_x_1_2(root2_3_3)).place(x=250, y=250)but4 = tk.Button(root2_3_3, text='返回', command=lambda: back(root2_3_3)).place(x=400, y=250)def root2_3_x_1_2(self):# 确认按钮执行数据的写入# cursor.execute("select * from book_information where book_id='1'")cursor.execute("update reader_information set reader_name ='" + entry_2.get() + "', reader_class='" + entry_3.get() + "',reader_category='" + entry_4.get() + "',reader_borrowednumber='" + entry_5.get() + "' where reader_id='" + entry_a.get() + "' ")# c = cursor.fetchall()# print(c[0][1])# cursor.execute("update book_information set book_name='%s',author='%s',book_category='%s',publisher='%s',book_total='%s' where book_id ='1' ") %(entry_2.get(),entry_3.get(),entry_4.get(),entry_5.get(),entry_6.get())conn.commit()conn.rollback()#self.destroy()tk.messagebox.showinfo(title="提示", message="读者信息更新成功")def back(self):self.destroy()root2_3_3.mainloop()def root2_3_x_1_2(self):# 返回按钮self.destroy()def root2_3_x_2(self):# 以读者名称更新图书信息self.destroy()root2_3_3 = tk.Toplevel()root2_3_3.title('以读者名称更改')root2_3_3.geometry('700x400')lab1 = tk.Label(root2_3_3, text='输入读者名称:')lab1.place(x=220, y=50)entry_a = tk.Entry(root2_3_3)entry_a.place(x=350, y=50)but1 = tk.Button(root2_3_3, text='确定', command=lambda: root2_3_x_1_2(root2_3_3))but1.place(x=220, y=80)but2 = tk.Button(root2_3_3, text='返回', command=lambda: back(root2_3_3))but2.place(x=400, y=80)def back(self):self.destroy()def root2_3_x_1_2(self):# 获取读者信息并进行更改写入数据库cursor.execute("select * from reader_information where reader_name='" + entry_a.get() + "' ")a = cursor.fetchall()conn.commit()conn.rollback()if len(a) == 0:return_value = tk.messagebox.showerror('提示', '未找到此读者')print(type(return_value), return_value)root2_3_3.destroy()else:# 查询到图书信息并输出,用文本框获取输入的值root2_3_4 = tk.Tk()root2_3_4.title('以读者名称更改')root2_3_4.geometry('700x400')tk.Label(root2_3_4, text='查询到此读者信息为', ).place(x=150, y=80)tk.Label(root2_3_4, text='请在下列输入框中输入您要更新的读者信息', ).place(x=400, y=80)tk.Label(root2_3_4, text='读者姓名', ).place(x=150, y=100)tk.Label(root2_3_4, text=a[0][0], ).place(x=250, y=100)tk.Label(root2_3_4, text=a[0][0], ).place(x=400, y=100)tk.Label(root2_3_4, text='读者编号', ).place(x=150, y=120)tk.Label(root2_3_4, text=a[0][1], ).place(x=250, y=120)entry_2 = tk.Entry(root2_3_4, )entry_2.place(x=400, y=120)tk.Label(root2_3_4, text='读者班级', ).place(x=150, y=140)tk.Label(root2_3_4, text=a[0][2], ).place(x=250, y=140)entry_3 = tk.Entry(root2_3_4, )entry_3.place(x=400, y=140)tk.Label(root2_3_4, text='读者类别', ).place(x=150, y=160)tk.Label(root2_3_4, text=a[0][3], ).place(x=250, y=160)entry_4 = tk.Entry(root2_3_4, )entry_4.place(x=400, y=160)tk.Label(root2_3_4, text='读者最大借阅数', ).place(x=150, y=180)tk.Label(root2_3_4, text=a[0][4], ).place(x=250, y=180)entry_5 = tk.Entry(root2_3_4, )entry_5.place(x=400, y=180)but3 = tk.Button(root2_3_4, text='确定', command=lambda: root2_3_x_1_3(root2_3_4)).place(x=250, y=250)but4 = tk.Button(root2_3_4, text='返回', command=lambda: back(root2_3_4)).place(x=400, y=250)def root2_3_x_1_3(self):# 确认按钮执行数据的写入reader_borrowednumber# cursor.execute("select * from book_information where book_id='1'")cursor.execute("update reader_information set reader_id ='" + entry_2.get() + "', reader_class='" + entry_3.get() + "',reader_category='" + entry_4.get() + "',reader_borrowednumber='" + entry_5.get() + "' where reader_name='" + entry_a.get() + "' ")# c = cursor.fetchall()# print(c[0][1])# cursor.execute("update book_information set book_name='%s',author='%s',book_category='%s',publisher='%s',book_total='%s' where book_id ='1' ") %(entry_2.get(),entry_3.get(),entry_4.get(),entry_5.get(),entry_6.get())conn.commit()conn.rollback()self.destroy()tk.messagebox.showinfo(title="提示", message="读者更新成功")root2_3_3.destroy()root2_3_4.mainloop()def fun3():root3 = tk.Tk()root3.title('图书借阅管理')root3.geometry('700x400')root3_1 =tk.Button(root3,text='图书借阅',font=('Arial', 12),width=15, height=1,command=lambda:root3_1_x(root3))root3_1.pack(expand=True)root3_2 =tk.Button(root3,text='图书归还',font=('Arial', 12),width=15, height=1,command=lambda:root3_2_x(root3))root3_2.pack(expand=True)root3.mainloop()def root3_1_x(self):#借书功能self.destroy()root3_1_1=tk.Tk()root3_1_1.title('图书借阅')root3_1_1.geometry('700x400')def borrow_book():cursor.execute("insert into reader_borrow values ('%s','%s','%s')" % (entry_1.get(),entry_2.get(),entry_3.get()))conn.commit()conn.rollback()tk.messagebox.showinfo(title="提示", message="图书借阅成功")root3_1_1.destroy()def back():root3_1_1.destroy()return fun3()tk.Label(root3_1_1,text='输入读者id:',).place(x=220,y=50)entry_1=tk.Entry(root3_1_1,)entry_1.place(x=350, y=50)tk.Label(root3_1_1,text='输入所借阅书名:',).place(x=220,y=100)entry_2=tk.Entry(root3_1_1,)entry_2.place(x=350, y=100)tk.Label(root3_1_1,text='输入借阅日期:',).place(x=220,y=150)entry_3=tk.Entry(root3_1_1,)entry_3.insert(0,day_now)entry_3.place(x=350, y=150)button1 =tk.Button(root3_1_1,text='确定',command=borrow_book).place(x=220,y=230)button2 =tk.Button(root3_1_1,text='返回',command=back).place(x=350,y=230)root3_1_1.mainloop()def root3_2_x(self):#还书功能self.destroy()root3_2_1=tk.Tk()root3_2_1.title('图书归还')root3_2_1.geometry('700x400')def back_book():cursor.execute("insert into reader_back values ('%s','%s','%s')" % (entry_1.get(),entry_2.get(),entry_3.get()))conn.commit()conn.rollback()tk.messagebox.showinfo(title="提示", message="图书归还成功")root3_2_1.destroy()def back():root3_2_1.destroy()return fun3()tk.Label(root3_2_1,text='输入读者id:',).place(x=220,y=50)entry_1=tk.Entry(root3_2_1,)entry_1.place(x=350, y=50)tk.Label(root3_2_1,text='输入所归还书名:',).place(x=220,y=100)entry_2=tk.Entry(root3_2_1,)entry_2.place(x=350, y=100)tk.Label(root3_2_1,text='输入归还日期:',).place(x=220,y=150)entry_3=tk.Entry(root3_2_1,)entry_3.insert(0,day_now)entry_3.place(x=350, y=150)button1 =tk.Button(root3_2_1,text='确定',command=back_book).place(x=220,y=230)button2 =tk.Button(root3_2_1,text='返回',command=back).place(x=350,y=230)root3_2_1.mainloop()def fun4():root4_1=tk.Toplevel()root4_1.title('罚款查询')root4_1.geometry('700x400')def select():def box1():cursor.execute("delete from reader_payment where reader_id = '"+entry_1.get()+"'")conn.commit()conn.rollback()tk.messagebox.showinfo(title="提示", message="缴纳成功")root4_1.destroy()root4_1_1.destroy()def back1(self):self.destroy()cursor.execute("delete from reader_payment where reader_id = '"+entry_1.get()+"'")conn.commit()conn.rollback()#return fun4()cursor.execute("exec proc_pay @id='"+ entry_1.get() +"'")a = cursor.fetchall()conn.commit()conn.rollback()if len(a)!=0:sum = 0for i in range(len(a)):x=a[i][2]y=a[i][3]x1 =x.strftime("%Y-%m-%d")y1=y.strftime("%Y-%m-%d")q=x1.split('-',2)[0]w = x1.split('-', 2)[1]e = x1.split('-', 2)[2]r=y1.split('-',2)[0]t = y1.split('-', 2)[1]u = y1.split('-', 2)[2]days=365*(int(q)-int(r))+31*(int(w)-int(t))+int(e)-int(u)sum = sum + (1.5 * days)cursor.execute("insert into reader_payment values ('%s','%d')" % (entry_1.get(),sum))conn.commit()conn.rollback()root4_1_1=tk.Tk()root4_1_1.title('罚款查询')root4_1_1.geometry('700x400')tk.Label(root4_1_1, text="{}待缴纳罚款:".format(entry_2.get()) ).place(x=160, y=50)tk.Label(root4_1_1, text="{}元".format(sum)).place(x=300, y=50)button1 = tk.Button(root4_1_1, text='确定缴纳', command=box1).place(x=160, y=230)button2 = tk.Button(root4_1_1, text='返回', command=lambda :back1(root4_1_1)).place(x=300, y=230)else:tk.messagebox.showinfo(title="提示", message="未查询到此人有待缴罚款")def back():root4_1.destroy()tk.Label(root4_1,text='输入读者id:',).place(x=220,y=50)entry_1=tk.Entry(root4_1,)entry_1.place(x=350, y=50)tk.Label(root4_1,text='输入读者姓名:',).place(x=220,y=100)entry_2=tk.Entry(root4_1,)entry_2.place(x=350, y=100)button1 =tk.Button(root4_1,text='确定',command=select).place(x=220,y=230)button2 =tk.Button(root4_1,text='返回',command=back).place(x=350,y=230)root4_1.mainloop()def fun5():root5 = tk.Tk()root5.title('信息查询')root5.geometry('700x400')function1 = tk.Button(root5, text='1.图书信息查询', font=('Arial', 12), width=15, height=1, command=lambda :root5_1(root5),)function1.pack(expand=True)function2 = tk.Button(root5, text='2.读者信息查询', font=('Arial', 12), width=15, height=1, command=lambda:root5_2(root5))function2.pack(expand=True)def root5_1(self):self.destroy()def back(self):self.destroy()def select_book_1():root5_1_1.update()root5_1_1.destroy()sql="select * from book_select"cursor.execute(sql)a=cursor.fetchall()print("--------------------作品信息--------------------")print('图书编号: 图书名称:图书总数:在馆册数: ')root5_1_1_1 = tk.Tk()root5_1_1_1.title('图书信息查询')root5_1_1_1.geometry('700x400')root5_1_1_1.configure()l = tk.Label(root5_1_1_1, text='图书信息如下')l.pack()l1 = tk.Label(root5_1_1_1, text='图书编号:')l1.place(x=20, y=40, width=90, height=20)l2 = tk.Label(root5_1_1_1, text='图书名称:')l2.place(x=135, y=40, width=90, height=20)l3 = tk.Label(root5_1_1_1, text='图书总数:')l3.place(x=270, y=40, width=90, height=20)l4 = tk.Label(root5_1_1_1, text='在馆册数:')l4.place(x=405, y=40, width=90, height=20)j=1t=0ex=0for i in range(len(a)):ex=ex+1t=t+1if t%5==0 or t==len(a):breakfor i in range(t-ex,t):y=j*45+40l11 = tk.Label(root5_1_1_1, text=('{}').format(a[i][0]))l11.place(x=20, y=y, width=90, height=20)l22 = tk.Label(root5_1_1_1, text=('{}').format(a[i][1]))l22.place(x=135, y=y, width=90, height=20)l33 = tk.Label(root5_1_1_1, text=('{}').format(a[i][2]))l33.place(x=270, y=y, width=90, height=20)l44 = tk.Label(root5_1_1_1,text=('{}').format(a[i][3]))l44.place(x=405, y=y, width=90, height=20)j=j+1if t!=len(a):buttonOk = tk.Button(root5_1_1_1, font=('Arial', 11), text='点击返回主页面',command=lambda: back(root5_1_1_1))buttonOk.place(x=250, y=350, width=160, height=40)buttonOk = tk.Button(root5_1_1_1, font=('Arial', 11), text='下一页',command=lambda: back(root5_1_1_1,'a3b1','we'))buttonOk.place(x=300, y=300, width=60, height=40)else:t=0buttonOk = tk.Button(root5_1_1_1,font=('Arial', 11), text='已是最后一页,点击返回主页面',command=lambda: back(root5_1_1_1))buttonOk.place(x=180, y=300, width=250, height=40)root5_1_1_1.mainloop()root5_1_1 = tk.Tk()root5_1_1.title('图书信息查询')root5_1_1.geometry('700x400')select_book_1()root5_1_1.mainloop()def root5_2(self):self.destroy()def back(self):self.destroy()def select_book_1():root5_1_2.update()root5_1_2.destroy()sql="select * from reader_information"cursor.execute(sql)a=cursor.fetchall()print("--------------------作品信息--------------------")print('读者编号: 读者名称:读者班级:读者类别:最大借阅数: ')root5_1_2_1 = tk.Tk()root5_1_2_1.title('读者信息查询')root5_1_2_1.geometry('700x400')root5_1_2_1.configure()l = tk.Label(root5_1_2_1, text='读者信息如下')l.pack()l1 = tk.Label(root5_1_2_1, text='读者编号:')l1.place(x=20, y=40, width=90, height=20)l2 = tk.Label(root5_1_2_1, text='读者名称:')l2.place(x=135, y=40, width=90, height=20)l3 = tk.Label(root5_1_2_1, text='读者班级:')l3.place(x=270, y=40, width=90, height=20)l4 = tk.Label(root5_1_2_1, text='读者类别:')l4.place(x=405, y=40, width=90, height=20)l5 = tk.Label(root5_1_2_1, text='最大借阅数:')l5.place(x=540, y=40, width=90, height=20)j=1t=0ex=0for i in range(len(a)):ex=ex+1t=t+1if t%5==0 or t==len(a):breakfor i in range(t-ex,t):y=j*45+40l11 = tk.Label(root5_1_2_1, text=('{}').format(a[i][0]))l11.place(x=20, y=y, width=90, height=20)l22 = tk.Label(root5_1_2_1, text=('{}').format(a[i][1]))l22.place(x=135, y=y, width=90, height=20)l33 = tk.Label(root5_1_2_1, text=('{}').format(a[i][2]))l33.place(x=270, y=y, width=90, height=20)l44 = tk.Label(root5_1_2_1,text=('{}').format(a[i][3]))l44.place(x=405, y=y, width=90, height=20)l55 = tk.Label(root5_1_2_1,text=('{}').format(a[i][4]))l55.place(x=540, y=y, width=90, height=20)j=j+1if t!=len(a):buttonOk = tk.Button(root5_1_2_1, font=('Arial', 11), text='点击返回主页面',command=lambda: back(root5_1_2_1))buttonOk.place(x=250, y=350, width=160, height=40)buttonOk = tk.Button(root5_1_2_1, font=('Arial', 11), text='下一页',command=lambda: back(root5_1_2_1,'a3b1','we'))buttonOk.place(x=300, y=300, width=60, height=40)else:t=0buttonOk = tk.Button(root5_1_2_1,font=('Arial', 11), text='已是最后一页,点击返回主页面',command=lambda: back(root5_1_2_1))buttonOk.place(x=180, y=300, width=250, height=40)root5_1_2_1.mainloop()root5_1_2 = tk.Tk()root5_1_2.title('图书信息查询')root5_1_2.geometry('700x400')select_book_1()root5_1_2.mainloop()now=datetime.datetime.now()day_year=now.yearday_month=now.monthday_day=now.dayday_now=('{}/{}/{}').format(day_year,day_month,day_day)window = tk.Tk()window.title('欢迎使用图书管理系统')window.geometry('450x300')# user informationtk.Label(window, text='User name: ').place(x=50, y=150)tk.Label(window, text='Password: ').place(x=50, y=190)var_usr_name = tk.StringVar()entry_usr_name = tk.Entry(window, textvariable=var_usr_name)entry_usr_name.place(x=160, y=150)var_usr_pwd = tk.StringVar()entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')entry_usr_pwd.place(x=160, y=190)def usr_login():usr_name = var_usr_name.get()usr_pwd = var_usr_pwd.get()try:with open('usrs_info.pickle', 'rb') as usr_file:usrs_info = pickle.load(usr_file)print(usrs_info)except FileNotFoundError:with open('usrs_info.pickle', 'wb') as usr_file:usrs_info = {'admin': 'admin'}pickle.dump(usrs_info, usr_file)if usr_name in usrs_info:if usr_pwd == usrs_info[usr_name]:window.destroy()return menu()cursor.close()else:tk.messagebox.showerror(message='Error, your password is wrong, try again.')else:is_sign_up = tk.messagebox.askyesno('Error, your a is wrong, try again.')def usr_sign_up():#确认注册函数,以便后面调用def signyes():username = sign_up_name.get()password = sign_up_pwd.get()confirmpass = sign_up_conf.get()try:with open('usrs_info.pickle','rb') as usr_file:exist_usr_info = pickle.load(usr_file)except FileNotFoundError:exist_usr_info = {}if username in exist_usr_info:tk.messagebox.showerror(message='用户已存在!')elif username == '' and password == '':tk.messagebox.showerror(message='用户名和密码不能为空!')elif password != confirmpass:tk.messagebox.showerror(message='密码前后不一致!')else:exist_usr_info[username] = passwordwith open('usrs_info.pickle', 'wb') as usr_file:pickle.dump(exist_usr_info, usr_file)tk.messagebox.showinfo(message='注册成功!')window_sign.destroy()#存完了就销毁页面#新建注册窗口window_sign = tk.Toplevel(window)window_sign.geometry('450x300')window_sign.title('sign up')#注册组件的文字部分tk.Label(window_sign, text='username: ').place(x=50, y=130)tk.Label(window_sign, text='password: ').place(x=50, y=160)tk.Label(window_sign, text='confirmpass: ').place(x=50, y=190)# 注册组件框部分sign_up_name = tk.StringVar()sign_up_pwd = tk.StringVar()sign_up_conf = tk.StringVar()enter_sign_up_name = tk.Entry(window_sign, textvariable=sign_up_name)enter_sign_up_name.place(x=160, y=130)enter_sign_up_pwd = tk.Entry(window_sign, textvariable=sign_up_pwd, show='*')enter_sign_up_pwd.place(x=160, y=160)enter_sign_up_conf = tk.Entry(window_sign, textvariable=sign_up_conf, show='*')enter_sign_up_conf.place(x=160, y=190)#确认注册按钮btn_confirm = tk.Button(window_sign, text='确定', command=signyes)btn_confirm.place(x=180, y=230)# login and sign up buttonbtn_login = tk.Button(window, text='Login', command=usr_login) #这里command是方法btn_login.place(x=170, y=230)btn_sign_up = tk.Button(window, text='Sign up', command=usr_sign_up)btn_sign_up.place(x=270, y=230)window.mainloop()

这之中登录界面子程序是在网上看到有作者发的就拿来用了,如果不能发请联系我删除。

输出作者信息和图书信息使用到的类计数器是改的朋友的代码,会有一些没有出现在本程序里面的参数导致影响阅读体验,但是本着代码能跑就不改的原则我没有进行更改,希望大家原谅