用wxpython实现的简单图书管理系统,可以实现增加图书,删除图书,修改图书,查看图书。后台数据库为mysql数据库,采用的pymysql连接数据库。系统界面如下:
代码如下:
1.书本类代码
#author = liuwei date = 2017-06-02 from datetime import * #导入日期模块 __metaclass__ = type class Book: '''一个书本信息类,包括书本名字,作者名字和书本简单信息''' def __init__(self, bookName = "", author = "", content = ""): self.bookName = bookName #书本名字 self.author = author #作者名字 self.content = content #书本信息 self.add_date = date.today() #书本添加日期 def setBookName(self, name): self.bookName = name def getBookName(self): return self.bookName def setAuthor(self, author): self.author = author def getAuthor(self): return self.author def setContent(self, content): self.content = content def getContent(self): return self.content def getAddDate(self): return self.add_date if __name__ == "__main__": mybook = Book() print(mybook.date)
2.数据库操作类代码
#author = liuwei date = 2017-06-02 #数据库帮助类 import pymysql from book import * __metaclass__ = type class DBHelper: def getCon(self): '''获取操作数据库的curcor即游标,首先的建立连接,需要服务器地址,端口号,用户名,密码和数据库名''' #为了能用中文,得加上编码方式 conn = pymysql.connect(host = "localhost", port = 3306, user = "root", password = "201392260", db = "library", charset = "utf8") return conn def insertBook(self, book): '''向数据库中book表插入书本信息,book为Book类对象,包含书本基本信息''' sql = "insert into book(name, author, content, add_date) values(%s, %s, %s, %s)" conn = self.getCon(); if conn ==None: return cursor = conn.cursor() cursor.execute(sql, (book.getBookName(), book.getAuthor(), book.getContent(), book.getAddDate())) conn.commit() cursor.close() conn.close() new_id = cursor.lastrowid print("新插入键值id为:", new_id) return new_id def getAllBook(self): '''返回数据库中,book表中所有的书本信息''' sql = "select *from book" conn = self.getCon() if conn == None: return cursor = conn.cursor() rownum = cursor.execute(sql) #执行并返回找到的行数 #获取查询结果 rows = cursor.fetchall() list = [] for item in rows: bitem = (item[0], item[1], str(item[4])) list.append(bitem) conn.commit() cursor.close() conn.close() return list def getBookById(self, bookid): '''根据书本id值来寻找书本信息''' sql = "select book.name, book.author, book.content from book where id=%s" conn = self.getCon() if conn == None: return cursor = conn.cursor() cursor.execute(sql, (bookid, )) #参数以元组形式给出 row = cursor.fetchone() #取到第一个结果 conn.commit() cursor.close() conn.close() return row #返回该书本信息 def saveUpdate(self, bookid, book): '''用book对象来修改id为bookid的书本信息''' sql = "update book set book.name=%s, book.author=%s, book.content=%s where book.id=%s" conn = self.getCon() if conn == None: return cursor = conn.cursor() cursor.execute(sql, (book.getBookName(), book.getAuthor(), book.getContent(), bookid)) conn.commit() cursor.close() conn.close() def deleteBook(self, bookid): '''根据书本id来删除书籍''' sql = "delete from book where book.id = %s" conn = self.getCon() if conn == None: return cursor = conn.cursor() cursor.execute(sql, (bookid, )) conn.commit() cursor.close() conn.close() if __name__ == '__main__': db = DBHelper() #book = Book("秦腔", "贾凹平", "讲的是大西北夏家和白家的事情,由引生口述。") #db.insertBook(book) list = db.getAllBook() for item in list: print(item)
3.主界面代码:
'''一个图书管理系统,能够实现增加书籍,删除书籍, 修改书籍和查看图书详情,基于mysql数据库和 wxPython''' import wx from book import * from dbhelper import * __metaclass__ = type class AddFrame(wx.Frame): '''添加书籍弹出的小窗口''' def __init__(self, parent, title): '''初始化该小窗口的布局''' self.mainframe = parent #生成一个300*300的框 wx.Frame.__init__(self, parent, title = title, size = (400, 250)) self.panel = wx.Panel(self, pos = (0, 0), size = (400, 250)) self.panel.SetBackgroundColour("#FFFFFF") #背景为白色 #三个编辑框,分别用来编辑书名,作者,书籍相关信息 bookName_tip = wx.StaticText(self.panel, label = "书名:", pos = (5, 8), size = (35, 25)) bookName_tip.SetBackgroundColour("#FFFFFF") bookName_text = wx.TextCtrl(self.panel, pos = (40, 5), size = (340, 25)) self.name = bookName_text author_tip = wx.StaticText(self.panel, label = "作者:", pos = (5, 38), size = (35, 25)) author_tip.SetBackgroundColour("#FFFFFF") author_text = wx.TextCtrl(self.panel, pos = (40, 35), size = (340, 25)) self.author = author_text content_tip = wx.StaticText(self.panel, label = "内容:", pos = (5, 68), size = (340, 25)) content_tip.SetBackgroundColour("#FFFFFF") content_text = wx.TextCtrl(self.panel, pos = (40, 65), size = (340, 100), style = wx.TE_MULTILINE) self.content = content_text save_button = wx.Button(self.panel, label = "保存书籍", pos = (160, 170)) self.Bind(wx.EVT_BUTTON, self.saveBook, save_button) #需要用到的数据库接口 self.dbhelper = DBHelper() def saveBook(self, evt): '''第一步:获取text中文本;第二步,连接数据库;第三步插入并获得主键;第四步添加到ListCtrl中''' bookName = self.name.GetValue() author = self.author.GetValue() content = self.content.GetValue() print("书名:"+bookName) if bookName == "" or author == "" or content == "": print("进来了") warn = wx.MessageDialog(self, message = "所有信息不能为空!!!", caption = "错误警告", style = wx.YES_DEFAULT | wx.ICON_ERROR) warn.ShowModal() #提示错误 warn.Destroy() return else: print("开始插入到数据库中") book = Book(bookName, author, content) book_id = self.dbhelper.insertBook(book) self.mainframe.addToList(book_id, book) self.Destroy() class UpdateFrame(wx.Frame): def __init__(self, parent, title, select_id): '''初始化更新图书信息界面总布局''' wx.Frame(parent, title = title, size = (400, 250)) #用来调用父frame,便于更新 self.mainframe = parent #生成一个300*300的框 wx.Frame.__init__(self, parent, title = title, size = (400, 250)) self.panel = wx.Panel(self, pos = (0, 0), size = (400, 250)) self.panel.SetBackgroundColour("#FFFFFF") #背景为白色 #三个编辑框,分别用来编辑书名,作者,书籍相关信息 bookName_tip = wx.StaticText(self.panel, label = "书名:", pos = (5, 8), size = (35, 25)) bookName_tip.SetBackgroundColour("#FFFFFF") bookName_text = wx.TextCtrl(self.panel, pos = (40, 5), size = (340, 25)) self.name = bookName_text author_tip = wx.StaticText(self.panel, label = "作者:", pos = (5, 38), size = (35, 25)) author_tip.SetBackgroundColour("#FFFFFF") author_text = wx.TextCtrl(self.panel, pos = (40, 35), size = (340, 25)) self.author = author_text content_tip = wx.StaticText(self.panel, label = "内容:", pos = (5, 68), size = (340, 25)) content_tip.SetBackgroundColour("#FFFFFF") content_text = wx.TextCtrl(self.panel, pos = (40, 65), size = (340, 100), style = wx.TE_MULTILINE) self.content = content_text save_button = wx.Button(self.panel, label = "保存修改", pos = (160, 170)) self.Bind(wx.EVT_BUTTON, self.saveUpdate, save_button) #选中的id和bookid self.select_id = select_id self.bookid = self.mainframe.list.GetItem(select_id, 0).Text #获取第select_id行的第0列的值 print(select_id, self.bookid) #需要用到的数据库接口 self.dbhelper = DBHelper() self.showAllText() #展现所有的text原来取值 def showAllText(self): '''显示概述本原始信息''' data = self.dbhelper.getBookById(self.bookid) #通过id获取书本信息 self.name.SetValue(data[0]) #设置值 self.author.SetValue(data[1]) self.content.SetValue(data[2]) def saveUpdate(self, evt): '''保存修改后的值''' bookName = self.name.GetValue() #获得修改后的值 author = self.author.GetValue() content = self.content.GetValue() print("书名:"+bookName) if bookName == "" or author == "" or content == "": print("进来了") warn = wx.MessageDialog(self, message = "所有信息不能为空!!!", caption = "错误警告", style = wx.YES_DEFAULT | wx.ICON_ERROR) warn.ShowModal() #提示错误 warn.Destroy() return else: print("开始将修改后的数据保存到数据库中") book = Book(bookName, author, content) #将数据封装到book对象中 self.dbhelper.saveUpdate(self.bookid, book) self.mainframe.list.SetItem(self.select_id, 1, bookName) self.Destroy() #修改完后自动销毁 class ShowFrame(wx.Frame): '''用来显示书籍的信息''' def __init__(self, parent, title, select_id): '''初始化该小窗口的布局''' #便于调用父窗口 self.mainframe = parent #生成一个300*300的框 wx.Frame.__init__(self, parent, title = title, size = (400, 250)) self.panel = wx.Panel(self, pos = (0, 0), size = (400, 250)) self.panel.SetBackgroundColour("#FFFFFF") #背景为白色 #三个编辑框,分别用来编辑书名,作者,书籍相关信息 bookName_tip = wx.StaticText(self.panel, label = "书名:", pos = (5, 8), size = (35, 25)) bookName_tip.SetBackgroundColour("#FFFFFF") bookName_text = wx.TextCtrl(self.panel, pos = (40, 5), size = (340, 25)) bookName_text.SetEditable(False) self.name = bookName_text author_tip = wx.StaticText(self.panel, label = "作者:", pos = (5, 38), size = (35, 25)) author_tip.SetBackgroundColour("#FFFFFF") author_text = wx.TextCtrl(self.panel, pos = (40, 35), size = (340, 25)) author_text.SetEditable(False) self.author = author_text content_tip = wx.StaticText(self.panel, label = "内容:", pos = (5, 68), size = (340, 25)) content_tip.SetBackgroundColour("#FFFFFF") content_text = wx.TextCtrl(self.panel, pos = (40, 65), size = (340, 100), style = wx.TE_MULTILINE) content_text.SetEditable(False) self.content = content_text #选中的id和bookid self.select_id = select_id self.bookid = self.mainframe.list.GetItem(select_id, 0).Text #获取第select_id行的第0列的值 #需要用到的数据库接口 self.dbhelper = DBHelper() self.showAllText() #展现所有的text原来取值 def showAllText(self): '''显示概述本原始信息''' data = self.dbhelper.getBookById(self.bookid) #通过id获取书本信息 self.name.SetValue(data[0]) #设置值 self.author.SetValue(data[1]) self.content.SetValue(data[2]) class LibraryFrame(wx.Frame): def __init__(self, parent, title): '''初始化系统总体布局,包括各种控件''' #生成一个宽为400,高为400的frame框 wx.Frame.__init__(self, parent, title=title, size=(400, 400)) #定一个网格布局,两行一列 self.main_layout = wx.BoxSizer(wx.VERTICAL) #生成一个列表 self.list = wx.ListCtrl(self, -1, size = (400,300), style = wx.LC_REPORT | wx.LC_HRULES | wx.LC_VRULES) #| wx.LC_SINGLE_SEL #列表有散列,分别是书本ID,书名,添加日期 self.list.InsertColumn(0, "ID") self.list.InsertColumn(1, "书名") self.list.InsertColumn(2, "添加日期") #设置各列的宽度 self.list.SetColumnWidth(0, 60) #设置每一列的宽度 self.list.SetColumnWidth(1, 230) self.list.SetColumnWidth(2, 92) #添加一组按钮,实现增删改查,用一个panel来管理该组按钮的布局 self.panel = wx.Panel(self, pos = (0, 300), size = (400, 100)) #定义一组按钮 add_button = wx.Button(self.panel, label = "添加", pos = (10, 15), size = (60, 30)) #, size = (75, 30) del_button = wx.Button(self.panel, label = "删除", pos = (110, 15), size = (60, 30)) #, size = (75, 30) update_button = wx.Button(self.panel, label = "修改", pos = (210, 15), size = (60, 30)) #, size = (75, 30) query_button = wx.Button(self.panel, label = "查看", pos = (310, 15), size = (60, 30)) #, size = (75, 30) #w为按钮绑定相应事件函数,第一个参数为默认参数,指明为按钮类事件,第二个为事件函数名,第三个为按钮名 self.Bind(wx.EVT_BUTTON, self.addBook, add_button) self.Bind(wx.EVT_BUTTON, self.delBook, del_button) self.Bind(wx.EVT_BUTTON, self.updateBook, update_button) self.Bind(wx.EVT_BUTTON, self.queryBook, query_button) #将列表和panel添加到主面板 self.main_layout.Add(self.list, 3) self.main_layout.Add(self.panel, 1) self.SetSizer(self.main_layout) #添加数据库操作对象 self.dbhelper = DBHelper() datas = self.dbhelper.getAllBook() for data in datas: index = self.list.InsertItem(self.list.GetItemCount(), str(data[0])) self.list.SetItem(index, 1, data[1]) self.list.SetItem(index, 2, data[2]) def addBook(self, evt): '''添加书籍按钮,弹出添加书籍框''' add_f = AddFrame(self, "添加书籍窗口") add_f.Show(True) def delBook(self, evt): '''删除书籍按钮,先选中,然后删除''' selectId = self.list.GetFirstSelected() if selectId == -1: warn = wx.MessageDialog(self, message = "未选中任何条目!!!", caption = "错误警告", style = wx.YES_DEFAULT | wx.ICON_ERROR) warn.ShowModal() #提示错误 warn.Destroy() return else: bookid = self.list.GetItem(selectId, 0).Text #得到书本id self.list.DeleteItem(selectId) #先在listctrl中删除选中行 self.dbhelper.deleteBook(bookid) def updateBook(self, evt): '''修改按钮响应事件,点击修改按钮,弹出修改框''' selectId = self.list.GetFirstSelected() if selectId == -1: warn = wx.MessageDialog(self, message = "未选中任何条目!!!", caption = "错误警告", style = wx.YES_DEFAULT | wx.ICON_ERROR) warn.ShowModal() #提示错误 warn.Destroy() return else: update_f = UpdateFrame(self, "修改书籍窗口", selectId) update_f.Show(True) def queryBook(self, evt): '''查看按钮响应事件''' selectId = self.list.GetFirstSelected() if selectId == -1: warn = wx.MessageDialog(self, message = "未选中任何条目!!!", caption = "错误警告", style = wx.YES_DEFAULT | wx.ICON_ERROR) warn.ShowModal() #提示错误 warn.Destroy() return else: show_f = ShowFrame(self, "修改书籍窗口", selectId) show_f.Show(True) def addToList(self, id, book): index = self.list.InsertItem(self.list.GetItemCount(), str(id)) self.list.SetItem(index, 1, book.getBookName()) self.list.SetItem(index, 2, str(book.getAddDate())) AppBaseClass = wx.App class LibraryApp(AppBaseClass): def OnInit(self): frame = LibraryFrame(None, "library-system") frame.Show() return True #类似于c中的main函数,但被其他模块导入时,__name__值不是"__main__" if __name__ == "__main__": app = LibraryApp() app.MainLoop()
代码中有详细的注释,有不懂可以留言,需要源码的也可以点击下方原文链接获取。
更多学习资料请关注专题《管理系统开发》。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。