Skip to content

Commit 589e359

Browse files
author
jiangyang
committed
TheStrayLibrary 是【类-图书馆系统】的升级版练习,分模块、结合了数据库、可视化、很适合用来理解类、实操数据库
1 parent d12a8af commit 589e359

9 files changed

Lines changed: 220 additions & 0 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# StrayLibrary
2+
```
3+
Use python to create StrayLibrary.
4+
```
5+
6+
# Mybog
7+
https://www.jiangmiemie.com
8+
9+
# Usage
10+
```
11+
Configure the operating environment, and the run "StrayLibrary.py".
12+
```
13+
14+
# Game Display
15+
![img](StrayLibrary/01.png)
16+
![img](StrayLibrary/02.png)
17+
![img](StrayLibrary/03.png)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
if __name__ == '__main__':
2+
from utils import *
3+
else:
4+
from .utils import *
5+
6+
database.bulildmysql() #创建数据库
7+
gui_start() #启动程序
15.5 KB
Loading
57.5 KB
Loading
56.3 KB
Loading
8 KB
Binary file not shown.
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
from .database import database
2+
from .userthinker import gui_start
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
from tkinter import *
2+
import sqlite3
3+
import os
4+
5+
class database():
6+
def addmysql(name, author, comment, state):#添加数据
7+
Desktoppath = './StrayLibrary/book.db'
8+
db = sqlite3.connect(Desktoppath)# 使用cursor()方法获取操作游标
9+
cursor = db.cursor()# SQL 插入语句
10+
sql = "INSERT INTO EMPLOYEE(name,author,comment,state)VALUES ('{}','{}','{}','{}')".format(name, author, comment, state)
11+
try:# 执行sql语句
12+
cursor.execute(sql)# 提交到数据库执行
13+
db.commit()
14+
except:# Rollback in case there is any error
15+
db.rollback()
16+
db.close()# 关闭数据库连接
17+
18+
def changemysql(state,name):#更改数据状态
19+
Desktoppath = './StrayLibrary/book.db'
20+
db = sqlite3.connect(Desktoppath)
21+
cursor = db.cursor()# 使用cursor()方法获取操作游标
22+
sql = "UPDATE EMPLOYEE SET state = '%s' where name = '%s' "%(state,name)
23+
try:
24+
cursor.execute(sql)
25+
db.commit()
26+
except:
27+
pass
28+
db.close()
29+
30+
def checkmysql():#检索数据库
31+
Desktoppath = './StrayLibrary/book.db'
32+
db = sqlite3.connect(Desktoppath)
33+
cursor = db.cursor()# 使用cursor()方法获取操作游标
34+
sql = "SELECT * FROM EMPLOYEE" # SQL 查询语句
35+
try:
36+
cursor.execute(sql)# 获取所有记录列表
37+
results = cursor.fetchall()
38+
return results
39+
except:
40+
pass
41+
db.close()
42+
43+
def bulildmysql():
44+
try:
45+
os.makedirs("./StrayLibrary") #创建一个文件夹
46+
Desktoppath = './StrayLibrary/book.db'#文件夹下创建一个数据库
47+
file=open(Desktoppath,'w')
48+
file.close()
49+
50+
db = sqlite3.connect(Desktoppath)
51+
cursor = db.cursor()# 使用cursor()方法获取操作游标
52+
cursor.execute("DROP TABLE IF EXISTS EMPLOYEE")# 如果数据表已经存在使用 execute() 方法删除表。
53+
sql = """CREATE TABLE EMPLOYEE (name TEXT(255),author TEXT(255),comment TEXT(255),state TEXT(255))"""
54+
cursor.execute(sql)# 创建数据表SQL语句
55+
db.close()
56+
database.addmysql('惶然录','费尔南多·佩索阿','一个迷失方向且濒于崩溃的灵魂的自我启示、一首对默默无闻、失败、智慧、困难和沉默的赞美诗。','未借出')
57+
database.addmysql('以箭为翅','简媜','调和空灵文风与禅宗境界,刻画人间之缘起缘灭。像一条柔韧的绳子,情这个字,不知勒痛多少人的心肉。','未借出')
58+
database.addmysql('心是孤独的猎手','卡森·麦卡勒斯','我们渴望倾诉,却从未倾听。女孩、黑人、哑巴、醉鬼、鳏夫的孤独形态各异,却从未退场。','已借出')
59+
except:
60+
pass
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
from tkinter import *
2+
from .database import database as db
3+
'''
4+
提前安装好模块:pip install tkinter-page
5+
需要掌握的知识:Python基础、Mysql命令、os模块、tkinter模块
6+
'''
7+
class Book():
8+
def __init__(self, name, author, comment, state):
9+
self.name = name
10+
self.author = author
11+
self.comment = comment
12+
self.state = state
13+
def __str__(self):
14+
return '\n名称:《%s》 \n作者:%s \n推荐语:%s\n状态:%s \n---------' % (self.name, self.author, self.comment,self.state)
15+
16+
class StrayLibrary():
17+
books = []
18+
def __init__(self,init_window_name):
19+
self.init_window_name = init_window_name
20+
results = db.checkmysql()
21+
for row in results:
22+
name = row[0]
23+
author = row[1]
24+
comment = row[2]
25+
state = row[3]
26+
book1 = Book(name, author, comment, state)
27+
self.books.append(book1)
28+
29+
def set_init_window(self):#设置窗口
30+
self.init_window_name.title("流浪图书馆(StrayLibrary)") #窗口名
31+
self.init_window_name.geometry('450x260+10+10')
32+
self.result_data_Text = Text(self.init_window_name, width=35, height=15) #处理结果展示
33+
self.result_data_Text.grid(row=1, column=12, rowspan=7, columnspan=7)
34+
35+
self.mianbutton1 = Button(self.init_window_name, text="查询(check)", bg="DodgerBlue", width=20,command=self.show_all_book) # 调用内部方法 加()为直接调用
36+
self.mianbutton2 = Button(self.init_window_name, text="添加(add)", bg="DodgerBlue",width=20,command=self.add_book) # 调用内部方法 加()为直接调用
37+
self.mianbutton3 = Button(self.init_window_name, text="借阅(lend)", bg="DodgerBlue", width=20,command=self.lend_book) # 调用内部方法 加()为直接调用
38+
self.mianbutton4 = Button(self.init_window_name, text="归还(return)", bg="DodgerBlue",width=20,command=self.return_book) # 调用内部方法 加()为直接调用
39+
self.mianbutton1.grid(row=1, column=11)
40+
self.mianbutton2.grid(row=3, column=11)
41+
self.mianbutton3.grid(row=5, column=11)
42+
self.mianbutton4.grid(row=7, column=11)
43+
44+
#功能函数
45+
def show_all_book(self):
46+
self.result_data_Text.delete(0.0,END)
47+
for book in self.books:
48+
self.result_data_Text.insert(1.0,book)
49+
def add_book(self):
50+
top = Tk()
51+
top.title("添加(add)")
52+
top.geometry('300x120+450+10')
53+
self.L1 = Label(top, text="请输入书籍名称:")
54+
self.E1 = Entry(top, bd =5)
55+
self.L2 = Label(top, text="请输入作者名称:")
56+
self.E2 = Entry(top, bd =5)
57+
self.L3 = Label(top, text="请输入书籍推荐语:")
58+
self.E3 = Entry(top, bd =5)
59+
self.L1.place(x=0,y=0)
60+
self.L2.place(x=0,y=30)
61+
self.L3.place(x=0,y=60)
62+
self.E1.place(x=120,y=0)
63+
self.E2.place(x=120,y=30)
64+
self.E3.place(x=120,y=60)
65+
self.B = Button(top, text ="输入完毕请点击确认,无需继续输入请关闭窗口", command = self.add_booking)
66+
self.B.pack(side = BOTTOM)
67+
def add_booking(self):
68+
new_name = self.E1.get()
69+
new_author = self.E2.get()
70+
new_comment = self.E3.get()
71+
self.result_data_Text.delete(0.0,END)
72+
new_book = Book(new_name, new_author, new_comment,'未借出')
73+
self.books.append(new_book)
74+
db.addmysql(new_name, new_author, new_comment,'未借出')#写入数据库
75+
self.result_data_Text.insert(1.0,new_name+'录入成功!\n')
76+
77+
def check_book(self,name):
78+
for book in self.books:
79+
if book.name == name:
80+
return book
81+
else:
82+
return None
83+
84+
def lend_book(self):
85+
toplend = Tk()
86+
toplend.title("借阅(lend)")
87+
toplend.geometry('330x50+450+30')
88+
self.lendE1 = Entry(toplend, bd =5)
89+
self.lendE1 .pack(side = RIGHT)
90+
self.lendB1 = Button(toplend, text ="输入书名,输入完毕请点击", command = self.lend_booking)
91+
self.lendB1.pack(side = LEFT)
92+
93+
def lend_booking(self):
94+
name = self.lendE1.get()
95+
res = self.check_book(name)
96+
self.result_data_Text.delete(0.0,END)
97+
if res != None:
98+
if res.state == '已借出':
99+
self.result_data_Text.insert(1.0,'你来晚了一步,这本书已经被借走了噢')
100+
else:
101+
res.state = '已借出'
102+
db.changemysql('已借出',res.name)
103+
self.result_data_Text.insert(1.0,'借阅成功,借了不看会变胖噢~')
104+
else:
105+
self.result_data_Text.insert(1.0,'这本书暂时没有收录在系统里呢')
106+
107+
def return_book(self):
108+
topreturn = Tk()
109+
topreturn.title("归还(return)")
110+
topreturn.geometry('330x50+450+30')
111+
self.returnE1 = Entry(topreturn, bd =5)
112+
self.returnE1 .pack(side = RIGHT)
113+
self.returnB1 = Button(topreturn, text ="输入书名,完毕请点击", command = self.return_booking)
114+
self.returnB1.pack(side = LEFT)
115+
116+
def return_booking(self):
117+
name = self.returnE1.get()
118+
res = self.check_book(name)# 调用check_book方法,将返回值赋值给变量res
119+
self.result_data_Text.delete(0.0,END)
120+
if res == None:# 如果返回的是空值,即这本书的书名不在系统里
121+
self.result_data_Text.insert(1.0,'没有这本书噢,你恐怕输错了书名~')
122+
else:# 如果返回的是实例对象
123+
if res.state =='未借出':# 如果实例属性state等于0,即这本书的借阅状态为'未借出'
124+
self.result_data_Text.insert(1.0,'这本书没有被借走,在等待有缘人的垂青呢!')
125+
else: # 如果实例属性state等于1,即状态为'已借出'
126+
self.result_data_Text.insert(1.0,'归还成功!')
127+
res.state ='未借出'# 归还后书籍借阅状态为0,重置为'未借出'
128+
db.changemysql('未借出',res.name)
129+
130+
def gui_start():
131+
init_window = Tk() #实例化出一个父窗口
132+
ZMJ_PORTAL = StrayLibrary(init_window) # 设置根窗口默认属性
133+
ZMJ_PORTAL.set_init_window()
134+
init_window.mainloop() #父窗口进入事件循环,可以理解为保持窗口运行,否则界面不展示

0 commit comments

Comments
 (0)