今年年初,我写了一篇名为《图书管理库以及操作界面》的文章(链接:http://blog.csdn.net/qq_32897527/article/details/50493313),但是由于技术问题,导致程序不是很优化,界面也不是很友好。最近得空稍微研究了下,对界面进行了升级。
1、使用表格进行数据项显示
升级前 升级后
#coding:gbk
import wx,sqlite3
import wx.lib.sheet as sheet
class find(wx.Frame):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
rel = conn.execute('SELECT * FROM library')
re = rel.fetchall()
if self.s.GetValue().encode('gbk') == '按书名':
t=[]
for i in re:
if i[1] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按出版社':
t=[]
for i in re:
if i[2] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按价格':
t=[]
for i in re:
if i[3] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按分类':
t=[]
for i in re:
if i[4] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '查询全部':
t = re
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '选择查询项':
dial = wx.MessageDialog(None,'请选择查询项','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self):
wx.Frame.__init__(self, None, -1, title='查询数据',
pos=(390,200),size=(410, 400),style=wx.CAPTION | wx.CLOSE_BOX)
panel = wx.Panel(self)
panel.SetBackgroundColour('white')
self.s = wx.ComboBox(panel,value='选择查询项',
choices=['按书名','按出版社','按价格','按分类','查询全部'],pos=(20,10),size=(100,20))
self.t = wx.TextCtrl(panel,pos=(130,10),size=(185,20))
self.cs = sheet.CSheet(panel)
self.cs.SetLabelBackgroundColour('white')
self.cs.SetNumberCols(4)
self.cs.SetNumberRows(0)
self.cs.SetSize((360,320))
self.cs.SetPosition((20,40))
column = ['书名','出版社','价格','类别']
for col in range(4):
self.cs.SetColLabelValue(col,column[col])
btn=wx.Button(panel,label="查询",pos=(325,10),size=(50,20))
btn.Bind(wx.EVT_BUTTON,self.load)
if __name__ == '__main__':
app = wx.App()
find().Show()
app.MainLoop()
主要使用wx.lib.sheet库创建表格
2、用notebook将find、insert、delete三个程序合并到一起
原先的是find、insert、delete三个程序进行三个不同的操作,但是这样太过麻烦。所以使用notebook可以实现一个程序实现三个操作。
#coding:gbk
import wx,sqlite3
class find(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
rel = conn.execute('SELECT * FROM library')
t = 0
h = 40
if self.x > 0:
for i in range(self.x):
h1 = 60 + 20*i
wx.StaticText(self, -1,' ',(20,h1))
wx.StaticText(self, -1,' ',(40,h1))
wx.StaticText(self, -1,' ',(120,h1))
wx.StaticText(self, -1,' ',(220,h1))
wx.StaticText(self, -1,' ',(260,h1))
if self.s.GetValue().encode('gbk') == '按书名':
for i in rel.fetchall():
if i[1] == self.t.GetValue():
t = t + 1
h = h + 20
id = '%d' %i[0]
name = i[1].encode('gbk')
pub = i[2].encode('gbk')
price = i[3].encode('gbk')
type = i[4].encode('gbk')
wx.StaticText(self, -1,id,(20,h))
wx.StaticText(self, -1,name,(40,h))
wx.StaticText(self, -1,pub,(120,h))
wx.StaticText(self, -1,price,(220,h))
wx.StaticText(self, -1,type,(260,h))
dial = wx.MessageDialog(None,'共有%d个结果'%t,'结果',wx.YES_NO)
dial.ShowModal()
self.x = t
if self.s.GetValue().encode('gbk') == '按出版社':
for i in rel.fetchall():
if i[2] == self.t.GetValue():
t = t + 1
h = h + 20
id = '%d' %i[0]
name = i[1].encode('gbk')
pub = i[2].encode('gbk')
price = i[3].encode('gbk')
type = i[4].encode('gbk')
wx.StaticText(self, -1,id,(20,h))
wx.StaticText(self, -1,name,(40,h))
wx.StaticText(self, -1,pub,(120,h))
wx.StaticText(self, -1,price,(220,h))
wx.StaticText(self, -1,type,(260,h))
dial = wx.MessageDialog(None,'共有%d个结果'%t,'结果',wx.YES_NO)
dial.ShowModal()
self.x = t
if self.s.GetValue().encode('gbk') == '按价格':
for i in rel.fetchall():
if i[3] == self.t.GetValue():
t = t + 1
h = h + 20
id = '%d' %i[0]
name = i[1].encode('gbk')
pub = i[2].encode('gbk')
price = i[3].encode('gbk')
type = i[4].encode('gbk')
wx.StaticText(self, -1,id,(20,h))
wx.StaticText(self, -1,name,(40,h))
wx.StaticText(self, -1,pub,(120,h))
wx.StaticText(self, -1,price,(220,h))
wx.StaticText(self, -1,type,(260,h))
dial = wx.MessageDialog(None,'共有%d个结果'%t,'结果',wx.YES_NO)
dial.ShowModal()
self.x = t
if self.s.GetValue().encode('gbk') == '按分类':
for i in rel.fetchall():
if i[4] == self.t.GetValue():
t = t + 1
h = h + 20
id = '%d' %i[0]
name = i[1].encode('gbk')
pub = i[2].encode('gbk')
price = i[3].encode('gbk')
type = i[4].encode('gbk')
wx.StaticText(self, -1,id,(20,h))
wx.StaticText(self, -1,name,(40,h))
wx.StaticText(self, -1,pub,(120,h))
wx.StaticText(self, -1,price,(220,h))
wx.StaticText(self, -1,type,(260,h))
dial = wx.MessageDialog(None,'共有%d个结果'%t,'结果',wx.YES_NO)
dial.ShowModal()
self.x = t
if self.s.GetValue().encode('gbk') == '查询全部':
for i in rel.fetchall():
t = t + 1
h = h + 20
id = '%d' %i[0]
name = i[1].encode('gbk')
pub = i[2].encode('gbk')
price = i[3].encode('gbk')
type = i[4].encode('gbk')
wx.StaticText(self, -1,id,(20,h))
wx.StaticText(self, -1,name,(40,h))
wx.StaticText(self, -1,pub,(120,h))
wx.StaticText(self, -1,price,(220,h))
wx.StaticText(self, -1,type,(260,h))
dial = wx.MessageDialog(None,'共有%d个结果'%t,'结果',wx.YES_NO)
dial.ShowModal()
self.x = t
if self.s.GetValue().encode('gbk') == '选择查询项':
dial = wx.MessageDialog(None,'请选择查询项','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
self.s = wx.ComboBox(self,value='选择查询项',
choices=['按书名','按出版社','按价格','按分类','查询全部'],pos=(20,10),size=(100,20))
self.t = wx.TextCtrl(self
,pos=(130,10),size=(100,20))
self.x = 0
wx.StaticText(self, -1, "id",(20,40))
wx.StaticText(self, -1, "书名",(40,40))
wx.StaticText(self, -1, "出版社",(120,40))
wx.StaticText(self, -1, "价格",(220,40))
wx.StaticText(self, -1, "类别",(260,40))
btn=wx.Button(self,label="查询",pos=(240,10),size=(50,20))
btn.Bind(wx.EVT_BUTTON,self.load)
class insert(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
n1=self.t1.GetValue()
n2=self.t2.GetValue()
n3=self.t3.GetValue()
n4=self.t4.GetValue()
s=[n1,n2,n3,n4]
conn.execute("insert into library(name,pub,price,type) values(?,?,?,?)",s)
conn.commit()
dial = wx.MessageDialog(None,'成功插入数据!','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
st1 = wx.StaticText(self, -1, "请输入书名:",(20,10))
st2 = wx.StaticText(self, -1, "请输入出版社:",(20, 60))
st3 = wx.StaticText(self, -1, "请输入价格:",(20, 110))
st4 = wx.StaticText(self, -1, "请选择分类:",(20, 160))
self.t1 = wx.TextCtrl(self,pos=(20,30),size=(100,20))
self.t2 = wx.TextCtrl(self,pos=(20,80),size=(100,20))
self.t3 = wx.TextCtrl(self,pos=(20,130),size=(100,20))
self.t4 = wx.ComboBox(self,value='未选择',
choices=['文学','理工科','计算机','外语','其他'],pos=(20,180),size=(100,20))
btn=wx.Button(self,label="插入",pos=(20,210),size=(100,30))
btn.Bind(wx.EVT_BUTTON,self.load)
class delete(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
n1=self.t1.GetValue()
s=[n1]
conn.execute('DELETE FROM library where name=?',s)
conn.commit()
dial = wx.MessageDialog(None,'成功删除数据!','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
st1 = wx.StaticText(self, -1, "请输入要删除的书名:",(20,20))
self.t1 = wx.TextCtrl(self,pos=(20,40),size=(150,20))
btn=wx.Button(self,label="删除",pos=(20,70),size=(100,30))
btn.Bind(wx.EVT_BUTTON,self.load)
if __name__ == '__main__':
app = wx.App(False)
frame = wx.Frame(None, title="图书管理")
nb = wx.Notebook(frame)
nb.AddPage(find(nb), "查找图书")
nb.AddPage(insert(nb), "插入图书")
nb.AddPage(delete(nb), "删除图书")
frame.Show()
app.MainLoop()
3、界面美化
#coding:gbk
import wx,sqlite3
import wx.lib.buttons as buttons
import wx.lib.sheet as sheet
class find(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
rel = conn.execute('SELECT * FROM library')
re = rel.fetchall()
if self.s.GetValue().encode('gbk') == '按书名':
t=[]
for i in re:
if i[1] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按出版社':
t=[]
for i in re:
if i[2] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按价格':
t=[]
for i in re:
if i[3] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '按分类':
t=[]
for i in re:
if i[4] == self.t.GetValue():
t.append(i)
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '查询全部':
t = re
rows = len(t)
self.cs.SetNumberRows(rows)
for row in range(rows):
self.cs.SetRowLabelValue(row,'%d'%t[row][0])
for col in range(4):
self.cs.SetCellValue(row,col,t[row][col+1])
dial = wx.MessageDialog(None,'共有%d个结果'%rows,'结果',wx.YES_NO)
dial.ShowModal()
if self.s.GetValue().encode('gbk') == '选择查询项':
dial = wx.MessageDialog(None,'请选择查询项','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
self.s = wx.ComboBox(self,value='选择查询项',
choices=['按书名','按出版社','按价格','按分类','查询全部'],pos=(20,10),size=(100,20))
self.t = wx.TextCtrl(self,pos=(130,10),size=(185,20))
self.cs = sheet.CSheet(self)
self.cs.SetLabelBackgroundColour('#ffffff')
self.cs.SetNumberCols(4)
self.cs.SetNumberRows(0)
self.cs.SetSize((550,520))
self.cs.SetPosition((20,40))
column = ['书名','出版社','价格','类别']
for col in range(4):
self.cs.SetColLabelValue(col,column[col])
btn=wx.Button(self,label="查询",pos=(325,10),size=(50,20))
btn.Bind(wx.EVT_BUTTON,self.load)
class insert(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
n1=self.t1.GetValue()
n2=self.t2.GetValue()
n3=self.t3.GetValue()
n4=self.t4.GetValue()
s=[n1,n2,n3,n4]
conn.execute("insert into library(name,pub,price,type) values(?,?,?,?)",s)
conn.commit()
dial = wx.MessageDialog(None,'成功插入数据!','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
st1 = wx.StaticText(self, -1, "请输入书名:",(20,10))
st2 = wx.StaticText(self, -1, "请输入出版社:",(20, 60))
st3 = wx.StaticText(self, -1, "请输入价格:",(20, 110))
st4 = wx.StaticText(self, -1, "请选择分类:",(20, 160))
self.t1 = wx.TextCtrl(self,pos=(20,30),size=(200,20))
self.t2 = wx.TextCtrl(self,pos=(20,80),size=(200,20))
self.t3 = wx.TextCtrl(self,pos=(20,130),size=(200,20))
self.t4 = wx.ComboBox(self,value='未选择',
choices=['文学','理工科','计算机','外语','其他'],pos=(20,180),size=(200,20))
btn=wx.Button(self,label="插入",pos=(20,210),size=(100,30))
btn.Bind(wx.EVT_BUTTON,self.load)
class delete(wx.Panel):
def load(self,event):
conn=sqlite3.connect("F:\\Python\My Program\library_system\library.db")
conn.cursor()
n1=self.t1.GetValue()
s=[n1]
conn.execute('DELETE FROM library where name=?',s)
conn.commit()
dial = wx.MessageDialog(None,'成功删除数据!','结果',wx.YES_NO)
dial.ShowModal()
def __init__(self,parent):
wx.Panel.__init__(self,parent)
st1 = wx.StaticText(self, -1, "请输入要删除的书名:",(20,20))
self.t1 = wx.TextCtrl(self,pos=(20,40),size=(200,20))
btn=wx.Button(self,label="删除",pos=(20,70),size=(100,30))
btn.Bind(wx.EVT_BUTTON,self.load)
def OnPaint(event):
dc = wx.PaintDC(lp)
dc.DrawBitmap(map,28,50)
def bt1(event):
b1.SetBackgroundColour('#011b27')
b2.SetBackgroundColour('#052b3b')
b3.SetBackgroundColour('#052b3b')
rp1.Show(1)
rp2.Show(0)
rp3.Show(0)
frame.Refresh()
def bt2(event):
b1.SetBackgroundColour('#052b3b')
b2.SetBackgroundColour('#011b27')
b3.SetBackgroundColour('#052b3b')
rp1.Show(0)
rp2.Show(1)
rp3.Show(0)
frame.Refresh()
def bt3(event):
b1.SetBackgroundColour('#052b3b')
b2.SetBackgroundColour('#052b3b')
b3.SetBackgroundColour('#011b27')
rp1.Show(0)
rp2.Show(0)
rp3.Show(1)
frame.Refresh()
app = wx.App(False)
frame = wx.Frame(None, title='图书管理',size=(800,600),style=wx.CAPTION | wx.CLOSE_BOX)
frame.SetBackgroundColour('#0a3142')
rp1 = find(frame)
rp2 = insert(frame)
rp3 = delete(frame)
rp1.SetBackgroundColour('#ffffff');rp1.SetSize((600,600));rp1.SetPosition((200,0))
rp2.SetBackgroundColour('#ffffff');rp2.SetSize((600,600));rp2.SetPosition((200,0))
rp3.SetBackgroundColour('#ffffff');rp3.SetSize((600,600));rp3.SetPosition((200,0))
rp2.Show(0)
rp3.Show(0)
lp = wx.Panel(frame,-1)
lp.SetSize((200,600))
b1 = buttons.GenButton(lp, -1, '查询图书',pos=(0,250),size=(200,50))
b2 = buttons.GenButton(lp, -1, '插入图书',pos=(0,300),size=(200,50))
b3 = buttons.GenButton(lp, -1, '删除图书',pos=(0,350),size=(200,50))
b1.SetBackgroundColour('#011b27');b1.SetForegroundColour('#ffffff');b1.SetBezelWidth(1);b1.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
b1.Bind(wx.EVT_BUTTON,bt1)
b2.SetBackgroundColour('#052b3b');b2.SetForegroundColour('#ffffff');b2.SetBezelWidth(1);b2.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
b2.Bind(wx.EVT_BUTTON,bt2)
b3.SetBackgroundColour('#052b3b');b3.SetForegroundColour('#ffffff');b3.SetBezelWidth(1);b3.SetFont(wx.Font(15, wx.DEFAULT, wx.NORMAL, wx.NORMAL))
b3.Bind(wx.EVT_BUTTON,bt3)
map = wx.Bitmap('photo.png')
wx.EVT_PAINT(lp,OnPaint)
frame.Show()
app.MainLoop()
都是些基本的wxpython,用于装饰界面