python圖書(shū)管理系統(tǒng)
本文實(shí)例為大家分享了python圖書(shū)管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下
實(shí)現(xiàn)語(yǔ)言:python
圖形框架:DTK+2.0
數(shù)據(jù)庫(kù)框架:SQLite 3.0
本程序需要以下部件運(yùn)行:
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"書(shū)本號(hào)", u"書(shū)名", u"作者", u"出版社",
u"價(jià)格", u"購(gòu)入日期", u"分類(lèi)", u"簡(jiǎn)介", u"館藏?cái)?shù)")
readerColumName = (u"讀者號(hào)", 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"書(shū)名", u"作者", u"出版社",
0.0, self.nowDate, u"分類(lèi)", u"簡(jiǎn)介", 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"讀者號(hào)", u"書(shū)號(hào)", 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"借書(shū)記錄", u"書(shū)本", 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"借書(shū)記錄已經(jīng)成功提交。")
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"請(qǐng)輸入純數(shù)字記錄。")
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"不存在該讀者號(hào): %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"不存在該書(shū)本號(hào): %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"已到最前頁(yè)。")
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"已到最后頁(yè)。")
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"請(qǐng)輸入查詢條件。")
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 所借書(shū)《%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"請(qǐng)先選擇錄入類(lèi)型。")
return
count = self.inputViewModel.get_n_columns()
if count == 3:
inputReaderInitData = (u"姓名", u"身份", u"備注")
self.inputViewModel.append(inputReaderInitData)
elif count == 8:
inputBookInitData = (u"書(shū)名", u"作者", u"出版社",
0.0, self.nowDate, u"分類(lèi)", u"簡(jiǎn)介", 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])
#錄入書(shū)目
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"記錄已經(jīng)成功提交。")
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"請(qǐng)輸入價(jià)格實(shí)數(shù)。")
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"請(qǐng)輸入整數(shù)。")
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語(yǔ)言程序設(shè)計(jì)", u"譚浩強(qiáng)", u"教育出版社", 29.90, u"2009-04-30", u"計(jì)算機(jī)", u"", 5),
(2, u"數(shù)據(jù)結(jié)構(gòu)", u"譚浩強(qiáng)", u"教育出版社", 29.90, u"2009-04-30", u"計(jì)算機(jī)", u"", 5),
(3, u"數(shù)據(jù)庫(kù)原理", u"譚浩強(qiáng)", u"教育出版社", 29.90, u"2009-04-30", u"計(jì)算機(jī)", u"", 5),
(4, u"匯編語(yǔ)言", u"譚浩強(qiáng)", u"教育出版社", 29.90, u"2009-04-30", u"計(jì)算機(jī)", u"", 5),
(5, u"大學(xué)國(guó)文", u"國(guó)立", u"教育出版社", 19.90, u"2009-04-30", u"文學(xué)", u"", 5),
(6, u"古代詩(shī)詞", u"國(guó)立", u"教育出版社", 19.90, u"2009-04-30", u"文學(xué)", u"", 5),
(7, u"廣州地圖", u"工作", u"廣州出版社", 9.90, u"2009-04-30", u"工具書(shū)", u"", 5),
(8, u"牛津詞典", u"詞典", u"廣州出版社", 9.90, u"2009-04-30", u"工具書(shū)", u"", 5))
for r in books:
c.execute("INSERT INTO books VALUES (?,?,?,?,?,?,?,?,?)", r)
readers = ((1001, u"陳一", u"廣州大學(xué)計(jì)算機(jī)學(xué)院", u"B15"),
(1002, u"王二", u"廣州大學(xué)計(jì)算機(jī)學(xué)院", u"B15"),
(1003, u"劉三", u"廣州大學(xué)美術(shù)學(xué)院", u"B12"),
(1004, u"陳一明", u"廣州大學(xué)人文學(xué)院", u"B10"),
(1005, u"張三", u"廣州大學(xué)人文學(xué)院", u"B5"),
(1006, u"何明", u"廣州大學(xué)土木工程學(xué)院", u"B22"),
(1007, u"陳中", u"廣州大學(xué)數(shù)學(xué)學(xué)院", u"B24"),
(1008, u"黃六", u"廣州大學(xué)體育學(xué)院", 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'))
源碼下載:圖書(shū)管理系統(tǒng)
更多學(xué)習(xí)資料請(qǐng)關(guān)注專(zhuān)題《管理系統(tǒng)開(kāi)發(fā)》。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python模擬實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- python實(shí)現(xiàn)簡(jiǎn)易圖書(shū)管理系統(tǒng)
- python編寫(xiě)圖書(shū)管理系統(tǒng)
- Python實(shí)現(xiàn)簡(jiǎn)易的圖書(shū)管理系統(tǒng)
- Python實(shí)現(xiàn)圖書(shū)借閱管理系統(tǒng)
- Python實(shí)現(xiàn)圖書(shū)管理系統(tǒng)設(shè)計(jì)
- python面向?qū)ο蠓▽?shí)現(xiàn)圖書(shū)管理系統(tǒng)
- wxpython實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- python實(shí)現(xiàn)圖書(shū)管理系統(tǒng)
- Python實(shí)現(xiàn)簡(jiǎn)單的圖書(shū)管理系統(tǒng)
相關(guān)文章
在Django中動(dòng)態(tài)地過(guò)濾查詢集的實(shí)現(xiàn)
本文主要介紹了Django中動(dòng)態(tài)地過(guò)濾查詢集的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
4款Python 類(lèi)型檢查工具,你選擇哪個(gè)呢?
這篇文章主要介紹了4款Python 類(lèi)型檢查工具的相關(guān)資料,幫助是及早檢查,提前發(fā)現(xiàn)類(lèi)型的錯(cuò)誤,增強(qiáng)代碼的一致性與可維護(hù)性。(還有防止脫發(fā),喵),感興趣的朋友可以了解下2020-10-10
Python中__init__和__new__的區(qū)別詳解
這篇文章主要介紹了Python中__init__和__new__的區(qū)別詳解,并著重說(shuō)明了__new__的作用及什么情況下使用__new__,需要的朋友可以參考下2014-07-07
通過(guò)Python實(shí)現(xiàn)猜燈謎游戲的示例代碼
新的一年迎來(lái)了元宵節(jié),元宵佳節(jié)在陪伴家人的同時(shí),自然也少不了賞花燈,猜燈謎的項(xiàng)目。本文會(huì)通過(guò)Python實(shí)現(xiàn)這一游戲,需要的可以參考一下2022-02-02
Python3.8如何解決No module named 'numpy&apos
這篇文章主要介紹了Python3.8如何解決No module named 'numpy'報(bào)錯(cuò)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Python2.7版os.path.isdir中文路徑返回false的解決方法
這篇文章主要為大家詳細(xì)介紹了Python2.7版os.path.isdir中文路徑返回false的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

