You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

577 lines
26 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from tkinter import *
from tkinter import ttk
import tkinter as tk
import tkinter.messagebox as msgbox
from tkinter import scrolledtext
import os
def Close():
reply=msgbox.askyesno('提示',"您确定退出系统吗?")
if reply==True:
root.destroy()
def Help():
HelpGUI=Toplevel()
HelpGUI.title('帮助')
HelpGUI.geometry('350x350')
HelpGUI.resizable(False,False)
scr=scrolledtext.ScrolledText(HelpGUI,width=40,height=20,font=("Microsoft YaHei",12))
scr.insert(tk.INSERT,"""\
用户须知:
1.本产品功能有限,仅支持这些操作:
1录入书籍信息
2浏览书籍信息
3删除书籍信息
4修改书籍信息
5按书名统计书籍的数量
6按作者统计书籍的数量
7按出版社统计书籍的数量
8按类别统计书籍的数量
2.有关上述操作的说明:
11.1至1.4功能全部在基本功能菜单栏下,且每录入一条书籍信息或者修改书籍信息或者删除书籍信息,都会实时更新在文件中,用户无需进行点击保存的操作,如果用户想要浏览文件信息,需要选择菜单栏下的“浏览书籍信息”即可看到当前存入的所有书籍
21.5至1.8功能在高级需求菜单栏下,这部分的功能会用一张表格输出
3有关排序的操作直接点击界面中的列名称即可系统会自动根据选中的列信息进行排序
4退出的功能直接点击关闭即可
3.产品说明:
·开发者:
计算机20-2班 王思进 201002603
""")
scr.configure(state='disabled')
scr.pack()
def CreateBookInfo():
CBIGUI=Toplevel()
CBIGUI.title('录入书籍信息')
CBIGUI.geometry('300x300')
def IsEmpty(text):
temp=0
for i in text:
if not i.isspace():
temp=1
break
if temp==1:
return 0
else:
return 1
def click():
num=addnuminput.get()
name=addnameinput.get()
author=addauthorinput.get()
press=addpressinput.get()
category=v.get()
if IsEmpty(num) or IsEmpty(name) or IsEmpty(author) or IsEmpty(press) or IsEmpty(category):
msgbox.showerror(title='提示',message="请填写所有信息!")
else:
f=open('图书.csv','r',encoding='utf-8-sig')
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[0]==num:
msgbox.showinfo(title='错误',message="序号已存在!")
f.close()
CBIGUI.destroy()
return
f.close()
f=open('图书.csv','a',encoding='utf-8-sig')
f.write('{},{},{},{},{}\n'.format(num,name,author,press,category))
f.close()
reply=msgbox.showinfo(title='提示',message ="写入成功!")
if reply:
CBIGUI.destroy()
addnum=Label(CBIGUI,text="序号",font=("Microsoft YaHei",10),anchor='w')
addnum.place(x=30,y=30,height=20,width=80)
addnuminput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addnuminput.place(x=100,y=30,height=24,width=150)
addname=Label(CBIGUI,text="书名",font=("Microsoft YaHei",10),anchor='w')
addname.place(x=30,y=60,height=20,width=80)
addnameinput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addnameinput.place(x=100,y=60,height=24,width=150)
addauthor=Label(CBIGUI,text="作者",font=("Microsoft YaHei",10),anchor='w')
addauthor.place(x=30,y=90,height=20,width=80)
addauthorinput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addauthorinput.place(x=100,y=90,height=24,width=150)
addpress=Label(CBIGUI,text="出版社",font=("Microsoft YaHei",10),anchor='w')
addpress.place(x=30,y=120,height=20,width=80)
addpressinput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addpressinput.place(x=100,y=120,height=24,width=150)
addcategory=Label(CBIGUI,text="类别",font=("Microsoft YaHei",10),anchor='w')
addcategory.place(x=30,y=150,height=20,width=80)
"""addcategoryinput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addcategoryinput.place(x=100,y=150,height=24,width=150)"""
v=StringVar()
v.set('其它')
w1=Radiobutton(CBIGUI,text="专业书", value='专业书',variable=v)
w2=Radiobutton(CBIGUI,text="工具书", value='工具书',variable=v)
w3=Radiobutton(CBIGUI,text="报告", value='报告',variable=v)
w4=Radiobutton(CBIGUI,text="小说", value='小说',variable=v)
w5=Radiobutton(CBIGUI,text="其它", value='其它',variable=v)
w1.place(x=100,y=150,height=20,width=60)
w2.place(x=100,y=170,height=20,width=60)
w3.place(x=95,y=190,height=20,width=60)
w4.place(x=95,y=210,height=20,width=60)
w5.place(x=95,y=230,height=20,width=60)
Buttonadd=Button(CBIGUI,command=click,text="添加",font=("Microsoft YaHei",10))
Buttonadd.place(x=120,y=260,height=30,width=70)
def DeleteBook():
DBGUI=Toplevel()
DBGUI.title('删除书籍信息')
DBGUI.geometry('400x400')
def click():
num=addnuminput.get()
fl=False
def confirm():
reply=msgbox.askyesno('提示',"您确定要删除该图书信息吗?")
if reply==True:
with open("图书.csv","r",encoding="utf-8-sig") as f:
lines=f.readlines()
with open("图书.csv","w",encoding="utf-8-sig") as f_w:
for line in lines:
info=line[:-1].split(",")
if info[0]==num:
continue
f_w.write(line)
DBGUI.destroy()
f=open('图书.csv','r',encoding='utf-8-sig')
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[0]==num:
fl=True
name=info[1];author=info[2];press=info[3];category=info[4]
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该图书信息!")
DBGUI.destroy()
else:
Info=Label(DBGUI,text="当前图书信息如下:")
Info.place(x=50,y=60)
addnum=Label(DBGUI,text="序号:"+num,font=("Microsoft YaHei",10),anchor='w')
addnum.place(x=50,y=90,height=15,width=80)
addname=Label(DBGUI,text="书名:"+name,font=("Microsoft YaHei",10),anchor='w')
addname.place(x=50,y=120,height=15,width=80)
addauthor=Label(DBGUI,text="作者:"+author,font=("Microsoft YaHei",10),anchor='w')
addauthor.place(x=50,y=150,height=15,width=80)
addpress=Label(DBGUI,text="出版社:"+press,font=("Microsoft YaHei",10),anchor='w')
addpress.place(x=50,y=180,height=15,width=80)
addcategory=Label(DBGUI,text="类别:"+category,font=("Microsoft YaHei",10),anchor='w')
addcategory.place(x=50,y=210,height=15,width=80)
adddeletebutton=Button(DBGUI,command=confirm,text="确认删除",font=("Microsoft YaHei",10))
adddeletebutton.place(x=170,y=270,height=30,width=60)
addnum=Label(DBGUI,text="序号",font=("Microsoft YaHei",10),anchor='w')
addnum.place(x=50,y=30,height=20,width=80)
addnuminput=Entry(DBGUI,font=("Microsoft YaHei",10))
addnuminput.place(x=100,y=30,height=24,width=150)
addsearchbutton=Button(DBGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=30,height=24,width=40)
def ModifyBook():
MBGUI=Toplevel()
MBGUI.title('修改书籍信息')
MBGUI.geometry('400x400')
def click():
num=addnuminput.get()
def IsEmpty(text):
temp=0
for i in text:
if not i.isspace():
temp=1
break
if temp==1:
return 0
else:
return 1
def confirm():
name=addnameinput.get()
author=addauthorinput.get()
press=addpressinput.get()
category=v.get()
if IsEmpty(name) or IsEmpty(author) or IsEmpty(press) or IsEmpty(category):
msgbox.showerror(title='提示',message="请填写所有信息!")
else:
reply=msgbox.askyesno('提示',"您确定要修改该图书信息吗?")
if reply==True:
with open("图书.csv","r",encoding="utf-8-sig") as f:
lines=f.readlines()
with open("图书.csv","w",encoding="utf-8-sig") as f_w:
for line in lines:
info=line[:-1].split(",")
if info[0]==num:
f_w.write('{},{},{},{},{}\n'.format(num,name,author,press,category))
continue
f_w.write(line)
MBGUI.destroy()
fl=False
f=open('图书.csv','r',encoding='utf-8-sig')
i=1;
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[0]==num:
fl=True
name=info[1];author=info[2];press=info[3];category=info[4]
i=i+1
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该图书信息!")
MBGUI.destroy()
else:
Info=Label(MBGUI,text="当前图书信息如下:")
Info.place(x=50,y=60)
sv=StringVar()
sv.set(name)
addname=Label(MBGUI,text="书名:",font=("Microsoft YaHei",10),anchor='w')
addname.place(x=50,y=90,height=15,width=80)
addnameinput=Entry(MBGUI,textvariable=sv,font=("Microsoft YaHei",10))
addnameinput.place(x=150,y=90,height=24,width=150)
sv=StringVar()
sv.set(author)
addauthor=Label(MBGUI,text="作者:",font=("Microsoft YaHei",10),anchor='w')
addauthor.place(x=50,y=120,height=15,width=80)
addauthorinput=Entry(MBGUI,textvariable=sv,font=("Microsoft YaHei",10))
addauthorinput.place(x=150,y=120,height=24,width=150)
sv=StringVar()
sv.set(press)
addpress=Label(MBGUI,text="出版社:",font=("Microsoft YaHei",10),anchor='w')
addpress.place(x=50,y=150,height=15,width=80)
addpressinput=Entry(MBGUI,textvariable=sv,font=("Microsoft YaHei",10))
addpressinput.place(x=150,y=150,height=24,width=150)
addcategory=Label(MBGUI,text="类别",font=("Microsoft YaHei",10),anchor='w')
addcategory.place(x=50,y=180,height=20,width=80)
"""addcategoryinput=Entry(CBIGUI,font=("Microsoft YaHei",10))
addcategoryinput.place(x=100,y=150,height=24,width=150)"""
v=StringVar()
v.set(category)
w1=Radiobutton(MBGUI,text="专业书", value='专业书',variable=v)
w2=Radiobutton(MBGUI,text="工具书", value='工具书',variable=v)
w3=Radiobutton(MBGUI,text="报告", value='报告',variable=v)
w4=Radiobutton(MBGUI,text="小说", value='小说',variable=v)
w5=Radiobutton(MBGUI,text="其它", value='其它',variable=v)
w1.place(x=100,y=180,height=20,width=60)
w2.place(x=100,y=200,height=20,width=60)
w3.place(x=95,y=220,height=20,width=60)
w4.place(x=95,y=240,height=20,width=60)
w5.place(x=95,y=260,height=20,width=60)
adddeletebutton=Button(MBGUI,command=confirm,text="确认修改",font=("Microsoft YaHei",10))
adddeletebutton.place(x=170,y=310,height=30,width=60)
addnum=Label(MBGUI,text="序号",font=("Microsoft YaHei",10),anchor='w')
addnum.place(x=50,y=30,height=20,width=80)
addnuminput=Entry(MBGUI,font=("Microsoft YaHei",10))
addnuminput.place(x=100,y=30,height=24,width=150)
addsearchbutton=Button(MBGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=30,height=24,width=40)
def CountName():
CNGUI=Toplevel()
CNGUI.title('按书名统计书籍的数量')
CNGUI.geometry('500x500')
def click():
name=addnameinput.get()
f=open('图书.csv','r',encoding='utf-8-sig')
fl=False
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[1]==name:
fl=True
break
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该图书信息!")
CNGUI.destroy()
else:
addnameinput.configure(state='disabled')
def treeview_sort_column(tv,col,reverse):
l=[(tv.set(k,col),k) for k in tv.get_children('')]
try:
l.sort(key=lambda t:int(t[0]),reverse=reverse)
except:
l.sort(reverse=reverse)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
tv.heading(col,command=lambda:treeview_sort_column(tv,col,not reverse))
columns=("序号","书名","作者", "出版社", "类别")
tree=ttk.Treeview(CNGUI,columns=columns)
tree['show']='headings'
tree.place(x=20,y=50,width=460,height=400)
tree.column("序号",width=30,anchor='c')
tree.column("书名",width=80,anchor='c')
tree.column("作者",width=80,anchor='c')
tree.column("出版社",width=80,anchor='c')
tree.column("类别",width=80,anchor='c')
tree.heading("序号",text="序号")
tree.heading("书名",text="书名")
tree.heading("作者",text="作者")
tree.heading("出版社",text="出版社")
tree.heading("类别",text="类别")
f=open('图书.csv','r',encoding='utf-8-sig')
i=0
for line in f.readlines():
info=line[:-1].split(",")
if info[1]==name:
tree.insert("",'end',values=(info[0],info[1],info[2],info[3],info[4]))
i=i+1
f.close()
for col in columns:
tree.heading(col,text=col,command=lambda _col=col:treeview_sort_column(tree,_col,False))
i=str(i)
addcount=Label(CNGUI,text="共有"+i+"条记录",font=("Microsoft YaHei",10))
addcount.place(x=400,y=460)
addname=Label(CNGUI,text="书名",font=("Microsoft YaHei",10),anchor='w')
addname.place(x=20,y=20,height=20,width=80)
addnameinput=Entry(CNGUI,font=("Microsoft YaHei",10))
addnameinput.place(x=100,y=20,height=24,width=150)
addsearchbutton=Button(CNGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=20,height=24,width=40)
def CountAuthor():
CAGUI=Toplevel()
CAGUI.title('按作者统计书籍的数量')
CAGUI.geometry('500x500')
def click():
author=addauthorinput.get()
f=open('图书.csv','r',encoding='utf-8-sig')
fl=False
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[2]==author:
fl=True
break
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该作者信息!")
CAGUI.destroy()
else:
addauthorinput.configure(state='disabled')
def treeview_sort_column(tv,col,reverse):
l=[(tv.set(k,col),k) for k in tv.get_children('')]
try:
l.sort(key=lambda t:int(t[0]),reverse=reverse)
except:
l.sort(reverse=reverse)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
tv.heading(col,command=lambda:treeview_sort_column(tv,col,not reverse))
columns=("序号","书名","作者", "出版社", "类别")
tree=ttk.Treeview(CAGUI,columns=columns)
tree['show']='headings'
tree.place(x=20,y=50,width=460,height=400)
tree.column("序号",width=30,anchor='c')
tree.column("书名",width=80,anchor='c')
tree.column("作者",width=80,anchor='c')
tree.column("出版社",width=80,anchor='c')
tree.column("类别",width=80,anchor='c')
tree.heading("序号",text="序号")
tree.heading("书名",text="书名")
tree.heading("作者",text="作者")
tree.heading("出版社",text="出版社")
tree.heading("类别",text="类别")
f=open('图书.csv','r',encoding='utf-8-sig')
i=0
for line in f.readlines():
info=line[:-1].split(",")
if info[2]==author:
tree.insert("",'end',values=(info[0],info[1],info[2],info[3],info[4]))
i=i+1
f.close()
for col in columns:
tree.heading(col,text=col,command=lambda _col=col:treeview_sort_column(tree,_col,False))
i=str(i)
addcount=Label(CAGUI,text="共有"+i+"条记录",font=("Microsoft YaHei",10))
addcount.place(x=400,y=460)
addauthor=Label(CAGUI,text="作者",font=("Microsoft YaHei",10),anchor='w')
addauthor.place(x=20,y=20,height=20,width=80)
addauthorinput=Entry(CAGUI,font=("Microsoft YaHei",10))
addauthorinput.place(x=100,y=20,height=24,width=150)
addsearchbutton=Button(CAGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=20,height=24,width=40)
def CountPress():
CPGUI=Toplevel()
CPGUI.title('按出版社统计书籍的数量')
CPGUI.geometry('500x500')
def click():
press=addpressinput.get()
f=open('图书.csv','r',encoding='utf-8-sig')
fl=False
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[3]==press:
fl=True
break
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该出版社信息!")
CPGUI.destroy()
else:
addpressinput.configure(state='disabled')
def treeview_sort_column(tv,col,reverse):
l=[(tv.set(k,col),k) for k in tv.get_children('')]
try:
l.sort(key=lambda t:int(t[0]),reverse=reverse)
except:
l.sort(reverse=reverse)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
tv.heading(col,command=lambda:treeview_sort_column(tv,col,not reverse))
columns=("序号","书名","作者", "出版社", "类别")
tree=ttk.Treeview(CPGUI,columns=columns)
tree['show']='headings'
tree.place(x=20,y=50,width=460,height=400)
tree.column("序号",width=30,anchor='c')
tree.column("书名",width=80,anchor='c')
tree.column("作者",width=80,anchor='c')
tree.column("出版社",width=80,anchor='c')
tree.column("类别",width=80,anchor='c')
tree.heading("序号",text="序号")
tree.heading("书名",text="书名")
tree.heading("作者",text="作者")
tree.heading("出版社",text="出版社")
tree.heading("类别",text="类别")
f=open('图书.csv','r',encoding='utf-8-sig')
i=0
for line in f.readlines():
info=line[:-1].split(",")
if info[3]==press:
tree.insert("",'end',values=(info[0],info[1],info[2],info[3],info[4]))
i=i+1
f.close()
for col in columns:
tree.heading(col,text=col,command=lambda _col=col:treeview_sort_column(tree,_col,False))
i=str(i)
addcount=Label(CPGUI,text="共有"+i+"条记录",font=("Microsoft YaHei",10))
addcount.place(x=400,y=460)
addpress=Label(CPGUI,text="出版社",font=("Microsoft YaHei",10),anchor='w')
addpress.place(x=20,y=20,height=20,width=80)
addpressinput=Entry(CPGUI,font=("Microsoft YaHei",10))
addpressinput.place(x=100,y=20,height=24,width=150)
addsearchbutton=Button(CPGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=20,height=24,width=40)
def CountCategory():
CCGUI=Toplevel()
CCGUI.title('按类别统计书籍的数量')
CCGUI.geometry('500x500')
def click():
category=addcategoryinput.get()
f=open('图书.csv','r',encoding='utf-8-sig')
fl=False
for line in f.readlines():
info=line[:-1].split(",")
if len(info)<5:
break
if info[4]==category:
fl=True
break
f.close()
if fl==False:
msgbox.showinfo(title='错误',message="未找到该类别信息!")
CCGUI.destroy()
else:
addcategoryinput.configure(state='disabled')
def treeview_sort_column(tv,col,reverse):
l=[(tv.set(k,col),k) for k in tv.get_children('')]
try:
l.sort(key=lambda t:int(t[0]),reverse=reverse)
except:
l.sort(reverse=reverse)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
tv.heading(col,command=lambda:treeview_sort_column(tv,col,not reverse))
columns=("序号","书名","作者", "出版社", "类别")
tree=ttk.Treeview(CCGUI,columns=columns)
tree['show']='headings'
tree.place(x=20,y=50,width=460,height=400)
tree.column("序号",width=30,anchor='c')
tree.column("书名",width=80,anchor='c')
tree.column("作者",width=80,anchor='c')
tree.column("出版社",width=80,anchor='c')
tree.column("类别",width=80,anchor='c')
tree.heading("序号",text="序号")
tree.heading("书名",text="书名")
tree.heading("作者",text="作者")
tree.heading("出版社",text="出版社")
tree.heading("类别",text="类别")
f=open('图书.csv','r',encoding='utf-8-sig')
i=0
for line in f.readlines():
info=line[:-1].split(",")
if info[4]==category:
tree.insert("",'end',values=(info[0],info[1],info[2],info[3],info[4]))
i=i+1
f.close()
for col in columns:
tree.heading(col,text=col,command=lambda _col=col:treeview_sort_column(tree,_col,False))
i=str(i)
addcount=Label(CCGUI,text="共有"+i+"条记录",font=("Microsoft YaHei",10))
addcount.place(x=400,y=460)
addcategory=Label(CCGUI,text="类别",font=("Microsoft YaHei",10),anchor='w')
addcategory.place(x=20,y=20,height=20,width=80)
addcategoryinput=Entry(CCGUI,font=("Microsoft YaHei",10))
addcategoryinput.place(x=100,y=20,height=24,width=150)
addsearchbutton=Button(CCGUI,command=click,text="查询",font=("Microsoft YaHei",10))
addsearchbutton.place(x=270,y=20,height=24,width=40)
def Root():
root.title('个人书籍管理系统')
root['width']=800
root['height']=600
menu=Menu(root)
submenu=Menu(menu,tearoff=0)
submenu.add_command(label="录入书籍信息",command=CreateBookInfo)
#submenu.add_command(label="保存书籍信息")
submenu.add_command(label="浏览书籍信息",command=Table)
#submenu.add_command(label="查询书籍信息")
submenu.add_command(label="删除书籍信息",command=DeleteBook)
submenu.add_command(label="修改书籍信息",command=ModifyBook)
menu.add_cascade(label="基本功能",menu=submenu)
submenu=Menu(menu,tearoff=0)
submenu.add_command(label="按书名统计书籍的数量",command=CountName)
submenu.add_command(label="按作者统计书籍的数量",command=CountAuthor)
submenu.add_command(label="按出版社统计书籍的数量",command=CountPress)
submenu.add_command(label="按类别统计书籍的数量",command=CountCategory)
#submenu.add_command(label="按书名对书籍进行排序")
menu.add_cascade(label="高级需求",menu=submenu)
submenu=Menu(menu,tearoff=0)
submenu.add_command(label="帮助",command=Help)
menu.add_cascade(label="工具",menu=submenu)
root.config(menu=menu)
addLabel=Label(root,text="点击“工具”->“帮助”即可查看本系统的相关操作",font=("Microsoft YaHei",10))
addLabel.place(x=20,y=560)
root.protocol("WM_DELETE_WINDOW",Close)
def Table():
def treeview_sort_column(tv,col,reverse):
l=[(tv.set(k,col),k) for k in tv.get_children('')]
try:
l.sort(key=lambda t:int(t[0]),reverse=reverse)
except:
l.sort(reverse=reverse)
for index,(val,k) in enumerate(l):
tv.move(k,'',index)
tv.heading(col,command=lambda:treeview_sort_column(tv,col,not reverse))
columns=("序号","书名","作者", "出版社", "类别")
tree=ttk.Treeview(root,columns=columns)
tree['show']='headings'
tree.place(x=10,y=10,width=780,height=550)
tree.column("序号",width=80,anchor='c')
tree.column("书名",width=150,anchor='c')
tree.column("作者",width=150,anchor='c')
tree.column("出版社",width=150,anchor='c')
tree.column("类别",width=150,anchor='c')
tree.heading("序号",text="序号")
tree.heading("书名",text="书名")
tree.heading("作者",text="作者")
tree.heading("出版社",text="出版社")
tree.heading("类别",text="类别")
f=open('图书.csv','r',encoding='utf-8-sig')
for line in f.readlines():
info=line[:-1].split(",")
tree.insert("",'end',values=(info[0],info[1],info[2],info[3],info[4]))
f.close()
for col in columns:
tree.heading(col,text=col,command=lambda _col=col:treeview_sort_column(tree,_col,False))
if __name__ == '__main__':
root=Tk()
Root()
open('图书.csv','a',encoding='utf-8-sig')
Table()
root.mainloop()