python图书管理系统


Posted in Python onApril 05, 2020

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

实现语言:python

图形框架:DTK+2.0

数据库框架:SQLite 3.0

本程序需要以下部件运行:

Python2.5.0、GTK+2.16、Pygtk 2.16、PyGobject 2.14、Pycairo 1.4

LibiaryManager.py

#!/usr/bin/python
# -*- coding: utf-8 -*-

import pygtk
pygtk.require('2.0')
import gtk
import sys
import gobject
import sqlite3
import time
import datetime

class LibManager:
 bookColumName = (u"书本号", u"书名", u"作者", u"出版社", 
 u"价格", u"购入日期", u"分类", u"简介", u"馆藏数")

 readerColumName = (u"读者号", u"读者姓名", u"读者身份", u"备注")

 def __init__(self):
 self.dbconn = sqlite3.connect('sqlitefile.db')
 self.cursor = self.dbconn.cursor()
 
 self.nowDate = time.strftime("%Y-%m-%d").decode("utf-8")
 inputBookInitData = (u"书名", u"作者", u"出版社", 
 0.0, self.nowDate, u"分类", u"简介", 0)

 try:
 builder = gtk.Builder()
 builder.add_from_file("ui.glade")
 except BaseException, e:
 self.errorMessage("Fail to load UI file.")
 print e
 sys.exit(1)

 builder.connect_signals(self)
 self.window = builder.get_object("mainWindow")

 self.borrowView = builder.get_object("borrowView")
 self.borrowViewModel = builder.get_object("borrowViewModel")
 self.borrowViewInit()

 self.returnView = builder.get_object("returnView")
 self.returnViewModel = builder.get_object("returnViewModel")
 self.returnEntryReaderID = builder.get_object("returnReaderID")
 self.returnEntryBookID = builder.get_object("returnBookID")
 self.returnViewInit()

 self.queryView = builder.get_object("queryView")
 self.queryViewReaderModel = builder.get_object("queryViewReaderModel")
 self.queryViewBookModel = builder.get_object("queryViewBookModel")


 self.inputView = builder.get_object("inputView")
 self.inputViewBookModel = builder.get_object("inputViewBookModel")
 self.inputViewReaderModel = builder.get_object("inputViewReaderModel")
 self.inputViewModel = None


 def borrowViewInit(self):
 columName = (u"读者号", u"书号", u"借出日期")
 columEditAttr = (True, True, False)
 for columnNum in range(len(columName)):
 renderer = gtk.CellRendererText()
 renderer.set_data("column", columnNum)
 renderer.set_property("editable", columEditAttr[columnNum])
 if columEditAttr[columnNum]:
 renderer.connect("edited", self.on_borrow_cell_edited)
 column = gtk.TreeViewColumn(columName[columnNum], renderer, 
  text=columnNum)
 column.set_resizable(True)
 self.borrowView.append_column(column)

 def returnViewInit(self):
 columName = (u"借书记录", u"书本", u"读者姓名", u"读者资料", u"借出日期")
 for columnNum in range(len(columName)):
 renderer = gtk.CellRendererText()
 column = gtk.TreeViewColumn(columName[columnNum], renderer, 
  text=columnNum)
 column.set_resizable(True)
 self.returnView.append_column(column)

 # QueryView
 def queryViewSetColumn(self, columName):
 self.queryRecord = 0
 columns = self.queryView.get_columns()
 for c in columns:
 self.queryView.remove_column(c)
 
 self.queryViewModel.clear()
 self.queryView.set_model(self.queryViewModel)
 for columnNum in range(len(columName)):
 renderer = gtk.CellRendererText()
 renderer.set_property("editable", True)
 column = gtk.TreeViewColumn(columName[columnNum], renderer, 
  text=columnNum)
 column.set_resizable(True)
 self.queryView.append_column(column)


 def queryReader(self):
 self.queryViewModel = self.queryViewReaderModel
 self.queryViewSetColumn(self.readerColumName)
 self.cursor.execute("SELECT COUNT(*) FROM reader")
 self.maxRecords = self.cursor.fetchone()[0]
 print self.maxRecords

 def queryBook(self):
 self.queryViewModel = self.queryViewBookModel
 self.queryViewSetColumn(self.bookColumName)
 self.cursor.execute("SELECT COUNT(*) FROM books")
 self.maxRecords = self.cursor.fetchone()[0]
 print self.maxRecords

 #inputView
 def inputViewSetColumn(self, columName):
 columns = self.inputView.get_columns()
 for c in columns:
 self.inputView.remove_column(c)
 
 self.inputViewModel.clear()
 self.inputView.set_model(self.inputViewModel)
 for columnNum in range(len(columName)):
 renderer = gtk.CellRendererText()
 renderer.set_property("editable", True)
 renderer.set_data("column", columnNum)
 renderer.connect("edited", self.on_input_cell_edited)

 column = gtk.TreeViewColumn(columName[columnNum], renderer, 
  text=columnNum)
 column.set_resizable(True)
 self.inputView.append_column(column)

 def inputReader(self):
 self.inputViewModel = self.inputViewReaderModel
 self.inputViewSetColumn(self.readerColumName[1:])

 def inputBook(self):
 self.inputViewModel = self.inputViewBookModel
 self.inputViewSetColumn(self.bookColumName[1:])

 #Callback Functions
 def on_mainWindow_delete_event(self, widget, data=None):
 print "destroy signal occurred"
 gtk.main_quit()

 #BorrowView
 def on_borrowAdd_clicked(self, button, data = None):
 self.borrowViewModel.append((1001, 1, self.nowDate))

 def on_borrowDel_clicked(self, button, data = None):
 selection = self.borrowView.get_selection()
 model, iter = selection.get_selected()
 if iter:
 model.remove(iter)

 def on_borrowClear_clicked(self, button, data = None):
 self.borrowViewModel.clear()

 def on_borrowSubmit_clicked(self, button, data = None):
 for row in self.borrowViewModel:
 self.cursor.execute("INSERT INTO borrow VALUES (NULL, ?, ?, ?)", row)
 self.dbconn.commit()
 self.infoMessage(u"借书记录已经成功提交。")
 self.borrowViewModel.clear()

 def on_borrow_cell_edited(self, cell, path_string, new_text):
 model = self.borrowViewModel
 iter = model.get_iter_from_string(path_string)
 column = cell.get_data("column")
 try:
 id = int(new_text)
 except ValueError, e:
 print e
 self.errorMessage(u"请输入纯数字记录。")
 return

 if column == 0:
 self.cursor.execute("SELECT * FROM reader where ReaderID = ?", [new_text])
 if self.cursor.fetchone():
 model.set(iter, column, id)
 else:
 self.errorMessage(u"不存在该读者号: %d。" % id)

 if column == 1:
 self.cursor.execute("SELECT * FROM books where BookID = ?", [new_text])
 if self.cursor.fetchone():
 model.set(iter, column, id)
 else:
 self.errorMessage(u"不存在该书本号: %d。" % id)

 #QueryView
 def on_queryBooks_clicked(self, button, data = None):
 self.queryBook()
 self.cursor.execute("SELECT * FROM books LIMIT ? OFFSET ?", [15, 0])
 for row in self.cursor:
 self.queryViewModel.append(row)

 def on_queryReaders_clicked(self, button, data = None):
 self.queryReader()
 self.cursor.execute("SELECT * FROM reader LIMIT ? OFFSET ?", [15, 0])
 for row in self.cursor:
 self.queryViewModel.append(row)

 def on_queryPrev_clicked(self, button, data = None):
 if self.queryRecord == 0:
 self.errorMessage(u"已到最前页。")
 return
 self.queryRecord -= 15
 self.queryViewModel.clear()

 if self.queryViewModel.get_n_columns() == 9:
 self.cursor.execute("SELECT * FROM books LIMIT ? OFFSET ?",[15, self.queryRecord])

 elif self.queryViewModel.get_n_columns() == 4:
 self.cursor.execute("SELECT * FROM reader LIMIT ? OFFSET ?",[15, self.queryRecord])

 for row in self.cursor:
 self.queryViewModel.append(row)


 def on_queryNext_clicked(self, button, data = None):
 if self.queryRecord + 15 > self.maxRecords:
 self.errorMessage(u"已到最后页。")
 return

 self.queryRecord += 15
 self.queryViewModel.clear()

 if self.queryViewModel.get_n_columns() == 9:
 self.cursor.execute("SELECT * FROM books LIMIT ? OFFSET ?",[15, self.queryRecord])

 elif self.queryViewModel.get_n_columns() == 4:
 self.cursor.execute("SELECT * FROM reader LIMIT ? OFFSET ?",[15, self.queryRecord])

 for row in self.cursor:
 self.queryViewModel.append(row)


 def on_returnQuery_clicked(self, button, data = None):
 readerid = self.returnEntryReaderID.get_text()
 bookid = self.returnEntryBookID.get_text()

 if len(readerid) and len(bookid):
 self.cursor.execute("SELECT borrow.BorrowID, books.BookName, reader.ReaderName,\
 reader.ReaderSchool, borrow.BorrowDate FROM borrow,books,reader\
 WHERE books.BookID = borrow.BookID AND \
 reader.ReaderID = borrow.ReaderID AND\
 borrow.ReaderID = ? AND borrow.BookID = ?", [readerid, bookid])
 elif len(readerid):
 self.cursor.execute("SELECT borrow.BorrowID, books.BookName, reader.ReaderName,\
 reader.ReaderSchool, borrow.BorrowDate FROM borrow,books,reader\
 WHERE books.BookID = borrow.BookID AND \
 reader.ReaderID = borrow.ReaderID AND\
 borrow.ReaderID = ?", [readerid])
 elif len(bookid):
 self.cursor.execute("SELECT borrow.BorrowID, books.BookName, reader.ReaderName,\
 reader.ReaderSchool, borrow.BorrowDate FROM borrow,books,reader\
 WHERE books.BookID = borrow.BookID AND \
 reader.ReaderID = borrow.ReaderID AND\
 borrow.BookID = ?", [bookid])
 else:
 self.errorMessage(u"请输入查询条件。")
 return

 self.returnViewModel.clear()

 for row in self.cursor:
 self.returnViewModel.append(row)
 

 def on_returnCommit_clicked(self, button, data = None):
 selection = self.returnView.get_selection()
 model, iter = selection.get_selected()
 if iter:
 borrowDate = time.strptime(model.get_value(iter, 4), "%Y-%m-%d")
 timeDelta = datetime.date.today() - datetime.date(*borrowDate[0:3])
 borrowDays = timeDelta.days

 borrowID = model.get_value(iter, 0)
 self.cursor.execute("DELETE FROM borrow WHERE BorrowID = ?", [borrowID])
 self.dbconn.commit()
 readerName = model.get_value(iter, 2)
 bookName = model.get_value(iter, 1)
 self.infoMessage(u"读者 %s 所借书《%s》归还成功。 借出%d天" % (readerName, bookName, borrowDays))
 model.remove(iter)

 #inputView
 def on_inputReader_clicked(self, button, data = None):
 self.inputReader()

 def on_inputBooks_clicked(self, button, data = None):
 self.inputBook()

 def on_inputAdd_clicked(self, button, data = None):
 if not self.inputViewModel:
 self.errorMessage(u"请先选择录入类型。")
 return
 count = self.inputViewModel.get_n_columns()
 if count == 3:
 inputReaderInitData = (u"姓名", u"身份", u"备注")
 self.inputViewModel.append(inputReaderInitData)
 elif count == 8:
 inputBookInitData = (u"书名", u"作者", u"出版社", 
 0.0, self.nowDate, u"分类", u"简介", 0)
 self.inputViewModel.append(inputBookInitData)

 def on_inputDel_clicked(self, button, data = None):
 selection = self.inputView.get_selection()
 model, iter = selection.get_selected()
 if iter:
 model.remove(iter)

 def on_inputSubmit_clicked(self, button, data = None):
 count = self.inputViewModel.get_n_columns()
 for row in self.inputViewModel:
 #录入读者
 if count == 3:
 self.cursor.execute(u"INSERT INTO reader VALUES (NULL, ?, ?, ?)", 
  [s.decode("utf-8") for s in row])

 #录入书目
 elif count == 8:
 dataRow = []
 for obj in row:
 if isinstance(obj, str):
 dataRow.append(obj.decode("utf-8"))
 else:
 dataRow.append(obj)
 print dataRow
 self.cursor.execute(u"INSERT INTO books VALUES (NULL, ?, ?, ?, ?, ?, ?, ?, ?)",\
  dataRow)
 self.dbconn.commit()
 self.infoMessage(u"记录已经成功提交。")
 self.inputViewModel.clear()

 def on_input_cell_edited(self, cell, path_string, new_text):
 iter = self.inputViewModel.get_iter_from_string(path_string)
 column = cell.get_data("column")
 columnCount = self.inputViewModel.get_n_columns()
 if columnCount == 3:
 self.inputViewModel.set(iter, column, new_text)
 elif columnCount == 8:
 if self.inputViewModel.get_column_type(column) == gobject.TYPE_FLOAT:
 try:
 self.inputViewModel.set(iter, column, float(new_text))
 except ValueError, e:
 self.errorMessage(u"请输入价格实数。")
 return
 elif self.inputViewModel.get_column_type(column) == gobject.TYPE_UINT:
 try:
 self.inputViewModel.set(iter, column, int(new_text))
 except ValueError, e:
 self.errorMessage(u"请输入整数。")
 return
 else:
 self.inputViewModel.set(iter, column, new_text)

 def errorMessage(self, message):
 print message
 dialog = gtk.MessageDialog(None,
  gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, message)
 dialog.run()
 dialog.destroy()

 def infoMessage(self, message):
 print message
 dialog = gtk.MessageDialog(None,
  gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
  gtk.MESSAGE_INFO, gtk.BUTTONS_OK, message)
 dialog.run()
 dialog.destroy()

 def main(self):
 self.window.show()
 gtk.main()

if __name__ == "__main__":
 app = LibManager()
 app.main()

LibDBInit.py

#!/usr/bin/python
#encoding:utf-8

import sqlite3

def LibDbInit(con):
 c = con.cursor()

 c.execute("""
 CREATE TABLE `books` (
 `BookID` INTEGER PRIMARY KEY,
 `BookName` TEXT ,
 `BookAuthor` TEXT ,
 `BookPublish` TEXT ,
 `BookPrice` FLOAT ,
 `BookDate` TEXT ,
 `BookType` TEXT ,
 `BookContent` TEXT ,
 `BookState` INTEGER
 )
 """)

 c.execute("""
 CREATE TABLE `reader` (
 `ReaderID` INTEGER PRIMARY KEY,
 `ReaderName` TEXT ,
 `ReaderSchool` TEXT ,
 `ReaderInfo` TEXT
 )
 """)

 c.execute("""
 CREATE TABLE `borrow` (
 `BorrowID` INTEGER PRIMARY KEY,
 `ReaderID` INTEGER ,
 `BookID` INTEGER ,
 `BorrowDate` TEXT
 )
 """)

 books = ((1, u"C语言程序设计", u"谭浩强", u"教育出版社", 29.90, u"2009-04-30", u"计算机", u"", 5),
 (2, u"数据结构", u"谭浩强", u"教育出版社", 29.90, u"2009-04-30", u"计算机", u"", 5),
 (3, u"数据库原理", u"谭浩强", u"教育出版社", 29.90, u"2009-04-30", u"计算机", u"", 5),
 (4, u"汇编语言", u"谭浩强", u"教育出版社", 29.90, u"2009-04-30", u"计算机", u"", 5),
 (5, u"大学国文", u"国立", u"教育出版社", 19.90, u"2009-04-30", u"文学", u"", 5),
 (6, u"古代诗词", u"国立", u"教育出版社", 19.90, u"2009-04-30", u"文学", u"", 5),
 (7, u"广州地图", u"工作", u"广州出版社", 9.90, u"2009-04-30", u"工具书", u"", 5),
 (8, u"牛津词典", u"词典", u"广州出版社", 9.90, u"2009-04-30", u"工具书", u"", 5))

 for r in books:
 c.execute("INSERT INTO books VALUES (?,?,?,?,?,?,?,?,?)", r)

 readers = ((1001, u"陈一", u"广州大学计算机学院", u"B15"),
 (1002, u"王二", u"广州大学计算机学院", u"B15"),
 (1003, u"刘三", u"广州大学美术学院", u"B12"),
 (1004, u"陈一明", u"广州大学人文学院", u"B10"),
 (1005, u"张三", u"广州大学人文学院", u"B5"),
 (1006, u"何明", u"广州大学土木工程学院", u"B22"),
 (1007, u"陈中", u"广州大学数学学院", u"B24"),
 (1008, u"黄六", u"广州大学体育学院", u"B25"))

 for r in readers:
 c.execute("INSERT INTO reader VALUES (?,?,?,?)", r)

 borrows = ((1, 1001, 1, u"2009-04-20"),
 (2, 1001, 2, u"2009-04-20"),
 (3, 1002, 3, u"2009-04-20"),
 (4, 1003, 5, u"2009-04-20"),
 (5, 1004, 4, u"2009-04-20"),
 (6, 1004, 2, u"2009-04-20"),
 (7, 1003, 7, u"2009-04-20"),
 (8, 1006, 8, u"2009-04-20"),
 (9, 1007, 2, u"2009-04-20"),
 (10, 1008, 8, u"2009-04-20"))

 for r in borrows:
 c.execute("INSERT INTO borrow VALUES (?,?,?,?)", r)

 # Save (commit) the changes
 con.commit()

if __name__ == "__main__":
 LibDbInit(sqlite3.connect('sqlitefile.db'))

源码下载:图书管理系统

更多学习资料请关注专题《管理系统开发》。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
用Python的Tornado框架结合memcached页面改善博客性能
Apr 24 Python
Python获取邮件地址的方法
Jul 10 Python
python多进程共享变量
Apr 06 Python
详解python中字典的循环遍历的两种方式
Feb 07 Python
python 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
python画折线图的程序
Jul 26 Python
python实现批量视频分帧、保存视频帧
May 31 Python
Python使用百度api做人脸对比的方法
Aug 28 Python
python 浅谈serial与stm32通信的编码问题
Dec 18 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Python脚本实现Zabbix多行日志监控过程解析
Aug 26 Python
matplotlib 使用 plt.savefig() 输出图片去除旁边的空白区域
Jan 05 Python
怎么使用pipenv管理你的python项目
Mar 12 #Python
python实现图书管理系统
Mar 12 #Python
python实现快速排序的示例(二分法思想)
Mar 12 #Python
Python中的pack和unpack的使用
Mar 12 #Python
python文本数据相似度的度量
Mar 12 #Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 #Python
python实现拓扑排序的基本教程
Mar 11 #Python
You might like
PHP个人网站架设连环讲(二)
2006/10/09 PHP
亲密接触PHP之PHP语法学习笔记1
2006/12/17 PHP
用PHP进行MySQL删除记录操作代码
2008/06/07 PHP
在JavaScript中调用php程序
2009/03/09 PHP
php5.4传引用时报错问题分析
2016/01/22 PHP
PHP+shell脚本操作Memcached和Apache Status的实例分享
2016/03/11 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
PHP preg_match实现正则表达式匹配功能【输出是否匹配及匹配值】
2017/07/19 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
终于解决了IE8不支持数组的indexOf方法
2013/04/03 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
jQuery动态添加删除select项(实现代码)
2013/09/03 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
JavaScript基本语法学习教程
2016/01/14 Javascript
AngularJS 仿微信图片手势缩放的实例
2017/09/28 Javascript
vue-router的HTML5 History 模式设置
2018/09/08 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
Python字符转换
2008/09/06 Python
详解Python中映射类型(字典)操作符的概念和使用
2015/08/19 Python
pyspark 读取csv文件创建DataFrame的两种方法
2018/06/07 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python进行TCP端口扫描的实现
2018/12/21 Python
Python计算一个点到所有点的欧式距离实现方法
2019/07/04 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
Clarks英国官方网站:全球领军鞋履品牌
2016/11/26 全球购物
日本航空官方网站:JAL
2019/06/19 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
一套C#面试题
2013/10/09 面试题
简述安装Slackware Linux系统的过程
2012/05/08 面试题
软件缺陷的分类都有哪些
2014/08/22 面试题
护理专业的自荐信
2013/10/22 职场文书
扩大国家免疫规划实施方案
2014/03/21 职场文书
先进教师个人总结
2015/02/11 职场文书
车间质检员岗位职责
2015/04/08 职场文书
HTML+CSS+JS实现图片的瀑布流布局的示例代码
2021/04/22 HTML / CSS