python实现图书管理系统

栏目: 编程语言 · Python · 发布时间: 6年前

内容简介:这篇文章主要为大家详细介绍了python实现图书管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了 python 实现图书管理系统的具体代码,供大家参考,具体内容如下

import mysql.connector
import sys, os
import time
import datetime
from tkinter import *
from tkinter.messagebox import *
class Libop:
  user = 'root'
  pwd = ''
  host = 'localhost'
  db = 'library'
  data_file = 'mysql-test.dat'
  def __init__(self):
    print("init")
    try:
      self.library=mysql.connector.connect(user=Libop.user,password=Libop.pwd,host=Libop.host,database=Libop.db)
      self.cursor=self.library.cursor()
      print("Connect successfully")
    except mysql.connector.Error as err:
      print("WTF! initial wrong")
      print("Error: {}".format(err.msg))
      sys.exit()
  def select(self,str):
    try:
      self.cursor.execute(str)
      return self.cursor.fetchall()
    except mysql.connector.Error as err:
      print("WTF! select wrong")
      print("Error:{}".format(err.msg))
      print(str)
      showinfo("ERROR","Please input the parameter correctly")
  def update(self,str):
    try:
      self.cursor.execute(str)
      self.library.commit()
      return 1
    except mysql.connector.Error as err:
      print("WTF! update wrong")
      print("Error:{}".format(err.msg))
      return 0
  def delete(self,str):
    try:
      self.cursor.execute(str)
      self.library.commit()
    except mysql.connector.Error as err:
      print("WTF! delete wrong")
      print("Error:{}".format(err.msg))
  def insert(self,str):
    try:
      self.cursor.execute(str)
      self.library.commit()
      return 1
    except mysql.connector.Error as err:
      print("WTF! insert wrong")
      print("Error:{}".format(err.msg))
      return 0
LIB = Libop()      
root=Tk()
root.wm_title("Library System")
str1=str2=''
book_type=name=year=publisher=writer=price1=price2=order=''
cardid=''
def call_rent(en1,en2,brok):
  st1=en1.get()
  st2=en2.get()
  rent(st1,st2,brok)
def call_return(en1,en2):
  st1=en1.get()
  st2=en2.get()
  back(st1,st2)
def login():
  str1=ide.get()
  str2=pwde.get()
  curs=LIB.select("select manage_id,pswd from managers where manage_id='{}' and pswd='{}'".format(str1,str2))
  if ((str1,str2) in curs): 
    showinfo('message','login success')
    label_book_id=Label(root,text='BookID:').grid(row=0,column=4,sticky=W)
    label_card_id=Label(root,text='CardID:').grid(row=1,column=4,sticky=W)
    entry_book_id=Entry(root)
    entry_book_id.grid(row=0,column=5,sticky=W)
    entry_card_id=Entry(root)
    entry_card_id.grid(row=1,column=5,sticky=W)
    entry_cardid=Entry(root)
    entry_cardid.grid(row=5,column=0,sticky=W)
    #buttons
    button_insert=Button(root,text='insert book',command=inbook)
    button_insert.grid(row=0,column=2,sticky=W)
    button_return=Button(root,text='rent book')
    button_return.bind("<ButtonRelease-1>",lambda z:call_rent(entry_book_id,entry_card_id,str1))
    button_return.grid(row=0,column=3,sticky=W)
    button_rent=Button(root,text='return book')
    button_rent.bind("<ButtonRelease-1>",lambda l:call_return(entry_book_id,entry_card_id))
    button_rent.grid(row=1,column=2,sticky=W)
    button_delete=Button(root,text='delete card')
    button_delete.bind("<ButtonRelease-1>",lambda j:deletecard(entry_cardid))
    button_delete.grid(row=5,column=2,sticky=W)
    button_add=Button(root,text='add card',command=addwindow)
    button_add.grid(row=5,column=3,sticky=W)
    button_display=Button(root,text='display books')
    button_display.bind("<ButtonRelease-1>",lambda y:display_rent(entry_cardid))
    button_display.grid(row=5,column=1,sticky=W)
  else: 
    showinfo(title='login failure',message="WRONG ID OR PASSWORD!")
#add a card
def addwindow():
  top=Toplevel(root)
  label_card_id=Label(top,text='card id:').grid(row=0,column=0,sticky=W)
  label_name=Label(top,text='Name:').grid(row=1,column=0,sticky=W)
  label_unit=Label(top,text='Units:').grid(row=2,column=0,sticky=W)
  label_type=Label(top,text='type:').grid(row=3,column=0,sticky=W)
  entry_card_id=Entry(top)
  entry_card_id.grid(row=0,column=1,sticky=W)
  entry_name=Entry(top)
  entry_name.grid(row=1,column=1,sticky=W)
  entry_unit=Entry(top)
  entry_unit.grid(row=2,column=1,sticky=W)
  entry_type=Entry(top)
  entry_type.grid(row=3,column=1,sticky=W)
  button_constructe=Button(top,text='Add')
  button_constructe.bind("<ButtonRelease-1>",lambda q:addcard(entry_card_id,entry_name,entry_unit,entry_type))
  button_constructe.grid(row=4)
def addcard(en1,en2,en3,en4):
  cardid=en1.get()
  name=en2.get()
  unit=en3.get()
  c_type=en4.get()
  select="select card_id from lib_card where card_id='{}'".format(cardid)
  if (c_type not in ('T','S','O')): 
    showinfo('error',"NO SUCH TYPE")
    return 0
  line=LIB.select(select)
  if (len(line)!=0):
    showinfo('addition failure',"Already have this ID!")
  else:
    insert="insert into lib_card values('{}','{}','{}','{}')".format(cardid,name,unit,c_type)
    LIB.insert(insert)
    showinfo('ok','addition success')
  return 1
#insert book
def inbook():
  insert_book=Toplevel(root)
  insert_book.title('insert book')
  text_insert=Text(insert_book)
  text_insert.pack()
  button_confirm=Button(insert_book,text='confirm')
  button_confirm.bind("<ButtonRelease-1>",lambda x:booksin(text_insert))
  button_confirm.pack()
def booksin(text_insert):
  string=text_insert.get('0.0',END)
  string=string.split('\n')
  print(string)
  for line in string:
    if line=='':
      break
    lines=line.split(',')
    bookid=lines[0][1:]
    t=lines[1]
    name=lines[2]
    publisher=lines[3]
    year=lines[4]
    writer=lines[5]
    price=lines[6]
    total=lines[7]
    stock=lines[8][:-1]
    if (int(stock)>int(total) or int(price)<0): 
      showinfo('insert error!','stock wrong or price is below 0!')
      continue
    #print("insert into book values('{}','{}','{}','{}',{},'{}',{},{},{})".format(bookid,t,name,publisher,year,writer,price,total,stock))
    t=LIB.insert("insert into book values('{}','{}','{}','{}',{},'{}',{},{},{})".format(bookid,t,name,publisher,year,writer,price,total,stock))
    if (t==0):
      showinfo('error','book {} has been inserted'.format(bookid))
  showinfo('success','insert has been done')
#original window
label_type=Label(root,text='TYPE').grid(row=3,sticky=W,column=0)
label_name=Label(root,text='NAME').grid(row=3,sticky=W,column=1)
label_year=Label(root,text='YEAR(XXXX-XXXX)').grid(row=3,sticky=W,column=2)
label_publisher=Label(root,text='PUBLISHER').grid(row=3,sticky=W,column=3)
label_writer=Label(root,text='WRITER').grid(row=3,sticky=W,column=4)
label_lowprice=Label(root,text='lowestprice').grid(row=3,sticky=W,column=5)
label_highprice=Label(root,text='highestprice').grid(row=3,sticky=W,column=6)
label_order=Label(root,text='order by').grid(row=0,sticky=W,column=6)

entry_type=Entry(root)
entry_type.grid(row=4,column=0,sticky=W)
entry_name=Entry(root)
entry_name.grid(row=4,column=1,sticky=W)
entry_year=Entry(root)
entry_year.grid(row=4,column=2,sticky=W)
entry_publisher=Entry(root)
entry_publisher.grid(row=4,column=3,sticky=W)
entry_writer=Entry(root)
entry_writer.grid(row=4,column=4,sticky=W)
entry_price1=Entry(root)
entry_price1.grid(row=4,column=5,sticky=W)
entry_price2=Entry(root)
entry_price2.grid(row=4,column=6,sticky=W)

#order the result
order_index=0
Lb_order=Listbox(root,selectmode=SINGLE,height=6)
order='name','book_type','T','writer','price','publisher'
Lb_order.insert(0,order[0])
Lb_order.insert(1,"type")
Lb_order.insert(2,"year")
Lb_order.insert(3,order[3])
Lb_order.insert(4,order[4])
Lb_order.insert(5,order[5])
Lb_order.grid(row=0,column=7,sticky=W)
Lb_order.selection_set(0)
def booksearch():
  select="select BookID,book_type,name,publisher,T,writer,price,total,stock from book"

  order_index=Lb_order.curselection()
  if (len(order_index)!=0):
    order_index=order_index[0]
  else:
    order_index=0;
  orders=order[order_index]
  name=entry_name.get()
  book_type=entry_type.get()
  publisher=entry_publisher.get()
  year=entry_year.get()
  writer=entry_writer.get()
  price1=entry_price1.get()
  price2=entry_price2.get()
  year1=year[0:4]
  year2=year[5:9]
  count=0
  if name!='':
    if count!=0:
      select+=" and"
    else:select+=" where"
    count+=1
    select+=" name='{}'".format(name)
  if book_type!='':
    if count!=0:
      select+=" and"
    else:select+=" where"
    count+=1
    select+=" book_type='{}'".format(book_type)
  if publisher!='':
    if count!=0:
      select+=" and"
    else:select+=" where"
    count+=1
    select+=" publisher='{}'".format(publisher)
  if year1!='':
    if year2=='':
      if count!=0:
        select+=" and"
      else:select+=" where"
      count+=1
      select+=" t={}".format(year1)
    else:
      if count!=0:
        select+=" and"
      else:select+=" where"
      count+=1
      select+=" T between {} and {}".format(year1,year2)
  if writer!='':
    if count!=0:
      select+=" and"
    else:select+=" where"
    count+=1
    select+=" writer='{}'".format(writer)
  if price1!='':
    if price2!='':
      if count!=0:
        select+=" and"
      else:select+=" where"
      count+=1
      select+=" price between {} and {}".format(price1,price2)
    else:
      if count!=0:
        selece+="and"
      else:select+=" where"
      count+=1
      select+=" price={}".format(price1)
  if orders=='':
    select+=" order by name"
  else:
    select+=" order by {}".format(orders)
  print(select)
  curs=LIB.select(select)
  searchresult=Toplevel(root)
  searchresult.title('result')
  text=Text(searchresult)
  text.insert(INSERT,"BookID\ttype\tname\tpublish\tyear\twriter\tprice\ttotal\tstock\n")
  for (BookIDs,book_types,names,publishers,years,writers,prices,totals,stocks) in curs:
    text.insert(INSERT,"{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format(BookIDs,book_types,names,publishers,years,writers,prices,totals,stocks))
  text.pack()
def display_rent(en_cardid):
  cardid=en_cardid.get()
  select="select card_id from lib_card where card_id='{}'".format(cardid)
  curs=LIB.select(select)
  order_index=Lb_order.curselection()
  if len(order_index)!=0 :
    order_index=order_index[0]
  else:
    order_index=0;
  orders=order[order_index]
  if ((cardid,) in curs):
    select="select card_id,name,unit,c_type from lib_card where card_id='{}'".format(cardid)
    curs=LIB.select(select)
    top=Toplevel(root)
    text=Text(top)
    for (card_id,name,unit,c_type) in curs:
      text.insert(INSERT,"card_id:{}\n".format(card_id))
      text.insert(INSERT,"name:{}\n".format(name))
      text.insert(INSERT,"unit:{}\n".format(unit))
      text.insert(INSERT,"c_type:{}\n".format(c_type))
    select="select BookID,book_type,name,publisher,t,writer,price,total,stock from book natural join record where card_id='{}' and still=1 order by {}".format(cardid,orders)
    curs=LIB.select(select)
    text.insert(INSERT,"BookID\ttype\tname\tpublish\tyear\twriter\tprice\ttotal\tstock\n")
    for (BookID,book_type,name,publisher,t,writer,price,total,stock) in curs:
      text.insert(INSERT,"{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format(BookID,book_type,name,publisher,t,writer,price,total,stock))
    text.pack()
  else:
    showinfo('Error',"NO SUCH CARD")
def checkcard(cardid):
  select="select card_id from lib_card where card_id='{}'".format(cardid)
  curs=LIB.select(select)
  if (cardid,) in curs:
    return 1
  else:
    return 0

def rent(BookID,cardid,brokerage):
  if not (checkcard(cardid)): 
    showinfo('error','no such card')
    return 0
  select="select stock from book where BookID='{}'".format(BookID)
  stocks=LIB.select(select)
  #stocks=curs.fetchall()
  stock=stocks[0]
  if (stock>(0,)):
    update="update book set stock=stock-1 where BookID='{}'".format(BookID)
    flag=LIB.update(update)
    if flag:
      insert="insert into record values('','{}','{}',CURDATE(),DATE_ADD(CURDATE(),INTERVAL 1 MONTH),'{}',1)".format(cardid,BookID,brokerage)
      LIB.insert(insert)
      showinfo('rent success','OK')
    else:
      showinfo('rent failure',"stock wrong")
  else:
    select="select return_time from record where BookID='{}' and return_time>=all(select return_time from record where BookID='{}')".format(BookID,BookID)
    date=LIB.select(select)
    #date=curs.fetchall()
    date=str (date)
    showinfo('Out of stock',"There are no more such book,The recent returning will be at:{}-{}-{}".format(date[16:20],date[22:23],date[26:27]))
    
  return 1
def back(BookID,cardid):
  if not(checkcard(cardid)): return 0
  select="select BookID from record where BookID='{}' and card_id='{}' and still=1".format(BookID,cardid)
  curs=LIB.select(select)
  if (BookID,) in curs:
    select="select record_id from record where BookID='{}' and card_id='{}' and still=1 order by rent_time".format(BookID,cardid)
    cur=LIB.select(select)
    #cur=curss.fetchall()
    for record in cur:
      recordid=str (record)
      recordid=recordid[1:]
      recordid=recordid[:-2]
      update="update record set still=0 where record_id='{}'".format(recordid)
      LIB.update(update)
      update="update book set stock=stock+1 where BookID='{}'".format(BookID)
      LIB.update(update)
      break
    showinfo('message',"Return Success!")
    return 1
  else:
    showinfo('error',"You can't return the book!")
    return 1

def deletecard(card):
  cardid=card.get()
  if not (checkcard(cardid)):
    showinfo('error',"NO SUCH CARD")
    return 0
  select="select record_id from record where card_id='{}' and still=1".format(cardid)
  curs=LIB.select(select)
  for record_id in curs:
    showinfo('error',"Some books this card rented haven't been returned")
    return 0
  delete="delete from lib_card where card_id='{}'".format(cardid)
  LIB.delete(delete)
  showinfo('ok','success')
  return 1
label_id=Label(root,text='ID: ')
label_id.grid(row=0,sticky=W)
ide=Entry(root)
ide.grid(row=0,column=1,sticky=E)
label_psw=Label(root,text='PassWord: ').grid(row=1,sticky=W)
pwde=Entry(root,show='*')
pwde.grid(row=1,column=1,sticky=E)
log_button=Button(root,text='Login',command=login)
log_button.grid(row=2,column=1)

button_search=Button(root,text='Search Book',command=booksearch)
button_search.grid(row=4,column=7,sticky=W)
print("all done")
root.mainloop()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Codercto.com。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Ruby元编程

Ruby元编程

[意] Paolo Perrotta / 廖志刚、陈睿杰 / 华中科技大学出版社 / 2012-1-10 / 56.00元

《Ruby元编程》以案例形式循序渐进讲解Ruby对象模型原理和高级应用技巧,堪称动态语言的设计模式。书中讲述的各种Ruby编程模式,完全可以应用于其他动态语言(甚至静态语言)。本书不仅适合Ruby程序员阅读,也适合对动态编程 语言和面向对象编程感兴趣的读者阅读。所有对程序设计理论感兴趣的人都能从中获益。Ruby之父松本行弘作序推荐。一起来看看 《Ruby元编程》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试