网站建设资源,做守望同人的网站,网站建设公司对父亲节宣传口号,网站推广方法主要有什么文章目录 前文运行环境功能图数据操作图书数据管理用户数据管理借书记录管理 功能界面管理员界面首页图书管理用户管理借书记录更改密码 普通用户界面 其他功能数字时间显示加载画面显示输入框提示词界面居中显示借书时间和还书时间记录公告栏数据操作 结尾 前文
本文将用tkin… 文章目录 前文运行环境功能图数据操作图书数据管理用户数据管理借书记录管理 功能界面管理员界面首页图书管理用户管理借书记录更改密码 普通用户界面 其他功能数字时间显示加载画面显示输入框提示词界面居中显示借书时间和还书时间记录公告栏数据操作 结尾 前文
本文将用tkinter模块来写一个图书管理系统将用户分为管理员和普通用户用户都有首页首页展示天气预报并有公告栏。管理员有权限对用户、图书进行添加、修改、删除等操作。普通用户只有搜索图书的功能。本文几乎涉tkinter的所有组件适合新手练习tkinter欢迎大家的订阅。
运行环境
编译器:PyCharm 2021.2.1 解释器:Anaconda 3.8 pip install opencv-python4.5.5.64 温馨提示最好是在本文所要求环境运行避免程序可能出现报错。
功能图 数据操作
数据操作是对数据进行操作如增删改查用户在界面上的操作实际就是对数据的操作只不过用户看到的是界面只需点点就行了操作更方便更容易因为我们都把功能写好了。
图书数据管理
Book类有7个方法分别为query_book()、add_book()、del_book()、 mod_book()、write_book()、read_book()first_add_book()。 query_book()为查询图书我们只需要把书的id、书名或者作者作为搜索条件将返回列表如果没有数据则返回空列表。 首先我们先获取所有列表的索引然后根据字典取值判断他们是否相等如果相等则添加到列表中否则就不添加。 add_book()添加图书首先调用query_book()函数传入id判断图书是否在书库里如果存在返回False不存在返回True表示可以添加。 del_book()根据传入的书名查找图书找到了就删除没有则不作为。 mod_book()修改图书和add_book()类似也是先查找找到图书根据传入的参数对图书进行修改。 write_book()写入文件将self.books写入文件并保存到本地。 read_book()读取所有的图书。 first_add_book()第一次运行没有图书将自动添加图书并创建文件夹保存数据格式为json。
import json
import os
数据格式
[{
id:, title:, author:, classify:, inventory:, content: }]
class Book:def __init__(self):self.first_add_book()self.read_book()# 查询def query_book(self, search):all_book_list []for i in range(0, len(self.books)):for v in [id, title, author]:# 也可用 findif str(search) self.books[i][v]:print(找到了, self.books[i])all_book_list.append(self.books[i])return all_book_list# 添加def add_book(self, id, title, author, classify, inventory, content):# 是否已经存入if not self.query_book(id):# 可以增加防重复的new_book {}new_book[id] idnew_book[title] titlenew_book[author] authornew_book[classify] classifynew_book[inventory] inventorynew_book[content] contentself.books.append(new_book)print(添加, new_book)self.write_book()return Trueelse:return False# 删除def del_book(self, book_name):result self.query_book(book_name)if result:self.books.remove(result[0])print(删除, result)self.write_book()# 修改def mod_book(self, old_id, id, title, author, classify, inventory, content):result self.query_book(old_id)if result:result[0][id] idresult[0][title] titleresult[0][author] authorresult[0][classify] classifyresult[0][inventory] inventoryresult[0][content] contentself.write_book()return Truereturn Falsedef write_book(self):with open(book_info.json, modew, encodingutf-8) as f:f.write(json.dumps(self.books))def read_book(self):with open(rbook_info.json, moder, encodingutf-8) as r:self.books json.loads(r.read())print(读取的数据, self.books)return self.booksdef first_add_book(self):self.books []name book_info.jsonif not (name in os.listdir()):print(开始初次写入用户信息)with open(rbook_info.json, modew, encodingutf-8) as f:id_num [123, 133, 456, 213]title [西游记, 红楼梦, 三国演义, 水浒传]author [吴承恩, 曹雪芹, 罗贯中, 施耐庵]classify [小说, 小说, 小说, 小说]inventory [1, 10, 20, 5]content [唐僧、孙悟空、猪八戒、沙僧、白龙马西天取经历经九九八十一难 终于取到真经的故事,《红楼梦》以贾宝玉、林黛玉、薛宝钗之间的恋爱婚姻悲剧为主线描写了以贾家为代表的四大家族的兴衰揭示了封建大家庭的各种错综复杂的矛盾,三国演义以描写战争为主反映了蜀、魏、吴三个政治集团之间的政治和军事斗争。,全书通过描写梁山好汉反抗欺压、水泊梁山壮大和受宋朝招安以及受招安后为宋朝征战最终消亡的宏大故事艺术地反映了中国历史上宋江起义从发生、发展直至失败的全过程深刻揭示了起义的社会根源满腔热情地歌颂了起义英雄的反抗斗争和他们的社会理想也具体揭示了起义失败的内在历史原因。]for i in range(4):data {}data[id] id_num[i]data[title] title[i]data[author] author[i]data[classify] classify[i]data[inventory] inventory[i]data[content] content[i]self.books.append(data)f.write(json.dumps(self.books, ensure_asciiFalse))print(初次写入完毕, self.books)if __name__ __main__:book Book()# book.query_book(123)# book.query_book(西游记)# book.query_book(水浒传)# book.del_book(西游记)a {id: 123, title: 西游记, author: 吴承恩, classify: 小说, inventory: 1,content: 唐僧、孙悟空、猪八戒、沙僧、白龙马西天取经历经九九八十一难 终于取到真经的故事}## book.add_book(*a)book.mod_book(133, *a)
用户数据管理
用户数据管理和图书数据管理类似这里就不作过多的讲解。看代码。
import json
import os
[{user:, password:, state:},{},][[], []] 学生用户 管理员用户
全部默认字符串
{user:[{}], admin:[{}]}
1 普通用户
2 管理员用户名唯一
# 用户信息用字典来操作 包括增删改查功能的实现class UserOperation:def __init__(self, flag):self.flag flagself.user_first_add()self.read_user()def user_add(self, user, password, state0):# 首先判断有没有重复的result self.user_query(user)if not result:if self.flag 1:self.user_info[stu].append({user: str(user), password: str(password), state: str(state)})self.write_user()return Trueif self.flag 2:self.user_info[admin].append({user: str(user), password: str(password)})self.write_user()return Trueelse:print(已经有了)def user_modify(self, user, old_password, new_password, state0):result self.user_query(user)if result:if result[password] old_password:if self.flag 1:for i in self.user_info[stu]:if result[user] i[user]:i[user] useri[password] new_passwordi[state] str(state)self.write_user()return Trueif self.flag 2:for i in self.user_info[admin]:if result[user] i[user]:i[user] useri[password] new_passwordself.write_user()return Truedef user_del(self, user):result self.user_query(user)if result:for i in self.user_info[stu]:if result[user] i[user]:self.user_info[stu].remove(i)print(删除成功)self.write_user()return Truedef user_query(self, user):if self.flag 1:for i in self.user_info[stu]:if user i[user]:print(查找成功)return ielse:return Noneif self.flag 2:for i in self.user_info[admin]:if user i[user]:print(查找成功)return ielse:return None# 读取所有数据def read_user(self):with open(ruser.json, moder, encodingutf-8) as r:self.user_info json.loads(r.read())print(读取的数据, self.user_info)# 用于写入数据def write_user(self):with open(ruser.json, modew, encodingutf-8) as w:w.write(json.dumps(self.user_info))print(写入的数据, self.user_info)def user_first_add(self):name user.jsonif not (name in os.listdir()):print(开始初次写入用户信息)with open(ruser.json, modew, encodingutf-8) as f:data {}data[stu] []data[stu].extend([{user: 123456, password: 123456, state: 0},{user: 123, password: 123, state: 0}])data[admin] []data[admin].append({user: admin, password: admin})f.write(json.dumps(data))print(初次写入完毕, data)if __name__ __main__:user_active UserOperation(1)print(user_active.user_query(123))# user_active.user_del(admin)# user_active.user_add(1234, 1234)# user_active.user_modify(123, 12345, 0)
借书记录管理
Record类主要函数是estimate_upper_limit()用于判断用户的借书数量当借书数量大于或者等于2时就返回True不允许用户再借书了。其余方法与上文相似看代码。
import os
import jsondef first_run():name record.jsonif not (name in os.listdir()):print(开始初次写入用户信息)with open(rrecord.json, modew, encodingutf-8) as f:f.write(json.dumps([]))class Record:def __init__(self):first_run()self.read_record()def read_record(self):with open(rrecord.json, moder, encodingutf-8) as f:self.record_books json.loads(f.read())def write_record(self):with open(rrecord.json, modew, encodingutf-8) as f:f.write(json.dumps(self.record_books))print(写入记录成功, self.record_books)# 借书上限为2def estimate_upper_limit(self, user):borrow_books []for book in self.record_books:if book[user] user:if int(book[book_num]) 1:return Trueelse:borrow_books.append(book)if len(borrow_books) 2:return Truereturn False# 还书def drop_book(self, book_id, user):all_books []for book in self.record_books:if book[id] book_id and book[user] user:all_books.append(book)if all_books:return all_booksreturn False# 查询用户def query_user(self, user):dance []for o in self.record_books:if o[user] user:dance.append(o)print(dance)return danceif __name__ __main__:record Record()record.write_record()
功能界面
登录界面核心功能check_login()函数用于检查登录是否成功检查是否存在此用户密码错误超过了三次账号就会被封禁需要联系管理员解封。管理员登录则宽松许多可以一直登录直到登录成功。
import tkinter
import tkinter.messagebox
from tkinter_book.operation_data.user_operation import UserOperation
import tkinter.ttk
from tkinter_book.other_fun.gui_loading import Loading
from tkinter_book.other_fun.center_gui import gui_centerclass Login(tkinter.Tk):def __init__(self):super(Login, self).__init__()self.title(登录)self.resizable() # 不允许更改窗口# style tkinter.ttk.Style()# print(style.theme_names())# style.theme_use(xpnative)gui_center(self, 500, 420)self.all_info UserOperation(1)self.all_info_2 UserOperation(2)self.num 0self.flag Falseself.shou_wel()self.gui_login()self.mainloop()def shou_wel(self):font_frame tkinter.Frame(self, width400, height50)book_manage tkinter.Label(font_frame, text欢迎登录图书管理系统, font(Arial, 24), foregroundred)book_manage.place(relx0.05, rely0.05)font_frame.place(relx0.15, rely0.05)def gui_login(self):user_frame tkinter.Frame(self, width400, height300)self.v_user tkinter.StringVar()self.v_password tkinter.StringVar()self.vali tkinter.IntVar()self.vali.set(1)self.text_user tkinter.Label(user_frame, text用户名, font(Arial, 19))self.entry_user tkinter.Entry(user_frame, width15, textvariableself.v_user, font(Arial, 19))self.text_password tkinter.Label(user_frame, text密 码, font(Arial, 19))self.entry_password tkinter.Entry(user_frame, width15, textvariableself.v_password, font(Arial, 19),show*)self.button_login tkinter.Button(user_frame, text登录, fgred, font(Arial, 20),commandself.check_login)self.radio1 tkinter.Radiobutton(user_frame, variableself.vali, value1, text学生登录, font(Arial, 9))self.radio2 tkinter.Radiobutton(user_frame, variableself.vali, value2, text管理员登录, font(Arial, 9))self.text_user.place(relx0.1, rely0.1)self.entry_user.place(relx0.32, rely0.1)self.text_password.place(relx0.1, rely0.25)self.entry_password.place(relx0.32, rely0.25)self.button_login.place(relx0.4, rely0.42)self.radio1.place(relx0.3, rely0.65)self.radio2.place(relx0.3, rely0.75)user_frame.place(relx0.1, rely0.2)self.show_text tkinter.Label(self, textC站关注天天501, font(Arial, 9))self.show_text.place(relx0.8, rely0.95)def check_login(self):# print(self.vali.get())# 学生登录if int(self.vali.get()) 1:e_get_u self.entry_user.get()e_get_p self.entry_password.get()result self.all_info.user_query(e_get_u)# print(result)if not result:tkinter.messagebox.showerror(错误提醒, 此账号不存在)returnif result[state] ! 0:tkinter.messagebox.showerror(提醒, 此账号已经封禁请联系管理员)returnif e_get_u result[user] and e_get_p result[password]:self.destroy()Loading()# print(登录成功!)self.flag Trueelif e_get_u result[user] and e_get_p ! result[password]:self.num 1if self.num 3:print(错误提醒, 账号锁定请联系管理员)self.num 0result[state] 1self.all_info.write_user()tkinter.messagebox.showerror(错误提醒, 此账号已经封禁请联系管理员)returntkinter.messagebox.showerror(错误提醒, f密码错误,你还有{str(3 - self.num)}机会)else:tkinter.messagebox.showerror(错误提醒, 账号或密码错误)# 学生登录if int(self.vali.get()) 2:e_get_u self.entry_user.get()e_get_p self.entry_password.get()result self.all_info_2.user_query(e_get_u)print(result)if not result:tkinter.messagebox.showerror(错误提醒, 此账号不存在)returnif e_get_u result[user] and e_get_p result[password]:self.destroy()Loading()print(登录成功!)self.flag Truereturn 2elif e_get_u result[user] and e_get_p ! result[password]:tkinter.messagebox.showerror(错误提醒, 密码错误)else:tkinter.messagebox.showerror(错误提醒, 账号或密码错误)if __name__ __main__:Login()
管理员界面
首页
首页的天气预报需要爬取数据我们选择爬2345的分为两部分第一部分将天气图片爬下来用类名存储图片。第二部分爬取城市天气数据用列表存储且支持搜索城市天气。这爬虫比较简单而且网站也没有什么反爬正常流程走就行了。下面展示部分代码。
# https://tianqi.2345.com/ 爬天气预报
import os
import urllib.parse
import requests
import parsel
from tkinter_book.background_url import update_pictdef search_city(name北京):# 定义字典data {city: , teacher: []}# 获取所有目录 图片缩放all_img_file update_pict()# 转化为url编码name_ urllib.parse.quote(name)url_1 fhttps://tianqi.2345.com/tpc/searchCity.php?q{name_}pTypepcheaders {Referer: https://tianqi.2345.com/,User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36}# 搜索 没有搜索到会返回空值search requests.get(urlurl_1, headersheaders)response_city search.json()[res]if response_city:url https://tianqi.2345.com response_city[0][href]response requests.get(urlurl, headersheaders)html_data parsel.Selector(response.text)city html_data.css(.banner-city-change span::text).get()tea_all html_data.css(#J_bannerList .banner-right-con-list-item)data[city] cityfor i in tea_all:week i.css(.banner-right-con-list-time::text).get().strip()date i.css(.date::text).get().strip()img i.css(.banner-right-con-list-icon::attr(class)).get().strip().split( )[-1] .png# 给图片设置路径if img in all_img_file:img imgs// imgelse:img imgs// wea-rc.png wea i.css(.banner-right-con-list-status::text).get().strip()tem i.css(.banner-right-con-list-temp::text).get().strip()data[teacher].append([week, date, img, wea, tem])return dataelse:print(搜索无效)data[city] Nonefor i in range(8):data[teacher].append([None, None, None, None, None])return dataif __name__ __main__:print(search_city())
既然数据已经爬取完了那接下来就是将数据展现出来这里用到了grid布局类似于表格方便咱们排列。下面看代码。
import tkinter.ttk
import tkinter
from tkinter_book.get_weather import search_city
from tkinter_book.other_fun.tip_entry import NewEntry
from tkinter_book.other_fun.announcement_data import announcement_write, announcement_read, first_write
import tkinter.messageboxclass HomePage:def __init__(self, flag):self.weather_lists []self.flag flagself.get_city_weather()self.gui_home()self.update_weather()self.set_text()def gui_home(self):self.home_frame tkinter.Frame()# 选项卡容器self.home_frame.pack()self.search_frame tkinter.Frame(self.home_frame)self.weather_frame tkinter.Frame(self.home_frame)self.search_frame.pack()self.weather_frame.pack()# 公告栏self.notice_label tkinter.LabelFrame(self.home_frame, text公告栏, width700, height200)# 不随子件变化self.notice_label.pack_propagate(0)self.notice_label.pack(pady30)def update_weather(self):self.weather_lists.clear() # 清空列表self.entry NewEntry(self.search_frame, 请输入搜索城市)button tkinter.Button(self.search_frame, text搜索, commandself.search_button)show_city tkinter.Label(self.search_frame, textself.data[city], font(宋体, 24))show_city.pack(sideleft, padx10, pady10)self.entry.pack(sideleft, padx10, pady10)button.pack(sideleft, padx5, pady10)# 列不变for column in range(1, 6):# 获取每一行的值for row in range(1, 9):if column ! 3:tkinter.Label(self.weather_frame, textself.data[teacher][row - 1][column - 1]).grid(rowcolumn,columnrow - 1,padx15,pady9)else:try:self.weather_lists.append(tkinter.PhotoImage(fileself.data[teacher][row - 1][column - 1]))tkinter.Label(self.weather_frame, imageself.weather_lists[row - 1]).grid(rowcolumn,columnrow - 1,padx15,pady9)except:tkinter.Label(self.weather_frame, text无图).grid(rowcolumn,columnrow - 1,padx15,pady9)def get_city_weather(self, city北京):try:self.data search_city(city)except:self.data {city: None, teacher: []}for i in range(8):self.data[teacher].append([None, None, None, None, None])def search_button(self):v self.entry.get_input_box()self.get_city_weather(v)print(self.data)# 删除搜索里的组件for item in self.search_frame.winfo_children():item.destroy()# 天气里的组件for item in self.weather_frame.winfo_children():item.destroy()self.update_weather()# 还要加按钮 设置文本def set_text(self):if self.flag 1:first_write()self.text tkinter.Text(self.notice_label)self.text.insert(tkinter.INSERT, announcement_read())self.text.configure(statedisabled)self.text.pack(filltkinter.BOTH, expandtrue)if self.flag 2:first_write()self.text tkinter.Text(self.notice_label)self.text.insert(tkinter.INSERT, announcement_read())self.text.pack(filltkinter.BOTH, expandtrue)# 提交按钮text_submit tkinter.Button(self.home_frame, text提交, width6, commandself.button_text)# self.text.window_create(1.9, windowtext_submit)text_submit.pack()def button_text(self):r self.text.get(1.0, tkinter.END)announcement_write(txtr)tkinter.messagebox.showinfo(提醒, 保存成功!, parentself.home_frame)if __name__ __main__:root tkinter.Tk()style tkinter.ttk.Style()note tkinter.ttk.Notebook(root)home HomePage(1)style.configure(TNotebook.Tab, font(微软雅黑, 20, bold), foregroundred)root.geometry(800x600450150)note.add(home.home_frame, text首页)note.pack(fillboth, expandtrue)root.mainloop()
图书管理
我们将图书管理分为两部分左边为为功能区右边为图书显示区。左边为添加、修改、借书、还书、删除。功能已经写好了我们只需要把界面写出来就行了右边也是一样的。
import tkinter
from tkinter_book.other_fun.tip_entry import NewEntry
import tkinter.ttk
import tkinter.messagebox
from tkinter_book.other_fun.center_gui import gui_center
from tkinter_book.operation_data.user_operation import UserOperation
from tkinter_book.operation_data.record_book import Record
from tkinter_book.operation_data.book_operation import Book
from tkinter_book.other_fun.write_time import ComputingTime对图书进行增删改查、图书的借还
添加 搜索
删除 show
修改
借书
还书
class Admin:def __init__(self):self.book Book()self.show_book()# 展示界面def show_book(self):self.main_show_frame tkinter.Frame()about_frame tkinter.LabelFrame(self.main_show_frame, width160, height500, text功能区)show_book_frame tkinter.Frame(self.main_show_frame, width800, height700)self.tree tkinter.ttk.Treeview(show_book_frame, columns(id, title, author, classify, inventory),showheadings, height20, selectmodebrowse)self.tree.heading(id, textid, anchorcenter)self.tree.heading(title, text书名, anchorcenter)self.tree.heading(author, text作者, anchorcenter)self.tree.heading(classify, text分类, anchorcenter)self.tree.heading(inventory, text库存, anchorcenter)self.tree.column(id, anchorcenter, width80)self.tree.column(title, anchorcenter, width160)self.tree.column(author, anchorcenter, width120)self.tree.column(classify, anchorcenter, width90)self.tree.column(inventory, anchorcenter, width80)for i in self.book.read_book():self.tree.insert(, tkinter.END, values(i[id], i[title], i[author], i[classify], i[inventory]))# 搜索框按钮self.search_entry NewEntry(show_book_frame, 请输入id或者作者)self.search_button tkinter.Button(show_book_frame, text搜索, commandself.search_v)self.update_button tkinter.Button(show_book_frame, text刷新, commandself.update_books)self.search_entry.place(relx0.3, rely0.05)self.search_button.place(relx0.5, rely0.04)self.update_button.place(relx0.55, rely0.04)self.tree.place(relx0.05, rely0.1)show_book_frame.place(relx0.25, rely0.01)# 按钮样式button_style tkinter.ttk.Style()button_style.configure(TButton, font(微软雅黑, 18, bold), foregroundgrey, width8)# 添加add_button tkinter.ttk.Button(about_frame, text添加, styleTButton, commandlambda: self.show_toplevel(1))add_button.pack(pady20)# 修改mod_button tkinter.ttk.Button(about_frame, text修改, styleTButton, commandlambda: self.show_toplevel(2))mod_button.pack(pady20)# 借书lend_button tkinter.ttk.Button(about_frame, text借书, styleTButton,commandlambda: self.borrow_toplevel())lend_button.pack(pady20)# 还书even_button tkinter.ttk.Button(about_frame, text还书, styleTButton,commandlambda: self.drop_toplevel())even_button.pack(pady20)# 删除del_button tkinter.ttk.Button(about_frame, text删除, styleTButton, commandself.del_books)del_button.pack(pady20)about_frame.pack_propagate(0)about_frame.place(relx0.03, rely0.01)# 双击事件 绑定事件要参数self.tree.bind(Double-1, self.click_double)def click_double(self, event):itm self.tree.set(self.tree.focus())query_result self.book.query_book(itm[id])# print(query_result)self.toplevel_content(query_result[0][content])# 双击事件 双击图书显示书中介绍def toplevel_content(self, content):toplevel tkinter.Toplevel()gui_center(toplevel, width500, height400)text tkinter.Text(toplevel)text.insert(tkinter.INSERT, content)text.configure(statetkinter.DISABLED)text.pack(fillboth, expandTrue)# 搜索图书def search_v(self):query self.book.query_book(self.search_entry.get_input_box())if query:for i in self.tree.get_children():self.tree.delete(i)for i in query:self.tree.insert(, tkinter.END,values(i[id], i[title], i[author], i[classify], i[inventory]))else:tkinter.messagebox.showerror(提醒, 无查询结果!)# 删除图书def del_books(self):return_v self.tree.set(self.tree.focus())self.book.del_book(return_v[id])self.update_books()# 更新图书def update_books(self):all_book self.book.read_book()for i in self.tree.get_children():self.tree.delete(i)for i in all_book:self.tree.insert(, tkinter.END,values(i[id], i[title], i[author], i[classify], i[inventory]))def show_toplevel(self, flag)::param flag: 1 添加 2 修改:return:self.toplevel tkinter.Toplevel()gui_center(self.toplevel, width600, height500)id_label tkinter.Label(self.toplevel, textid, fgred, font(微软雅黑, 15, bold))self.id_entry tkinter.Entry(self.toplevel)id_label.pack()self.id_entry.pack()title_label tkinter.Label(self.toplevel, text书名, fgred, font(微软雅黑, 15, bold))self.title_entry tkinter.Entry(self.toplevel)title_label.pack(pady4)self.title_entry.pack()author_label tkinter.Label(self.toplevel, text作者, fgred, font(微软雅黑, 15, bold))self.author_entry tkinter.Entry(self.toplevel)author_label.pack(pady4)self.author_entry.pack()classify_label tkinter.Label(self.toplevel, text分类, fgred, font(微软雅黑, 15, bold))self.classify_entry tkinter.Entry(self.toplevel)classify_label.pack(pady4)self.classify_entry.pack()inventory_label tkinter.Label(self.toplevel, text库存, fgred, font(微软雅黑, 15, bold))self.inventory_entry tkinter.Entry(self.toplevel)inventory_label.pack(pady4)self.inventory_entry.pack()self.submit tkinter.Button(self.toplevel, text提交, fgred, font(微软雅黑, 15, bold),)self.submit.pack(sideleft)self.content_text tkinter.Text(self.toplevel)self.content_text.pack(pady4)# 添加if flag 1:self.submit.configure(commandself.toplevel_submit)# 修改if flag 2:itm self.tree.set(self.tree.focus())if itm:self.id_entry.insert(0, itm[id])self.title_entry.insert(0, itm[title])self.author_entry.insert(0, itm[author])self.classify_entry.insert(0, itm[classify])self.inventory_entry.insert(0, itm[inventory])content self.book.query_book(itm[id])self.content_text.insert(0.1, content[0][content])self.submit.configure(text修改,commandlambda: self.modify_button(itm[id], self.id_entry.get(), self.title_entry.get(),self.author_entry.get(),self.classify_entry.get(),self.inventory_entry.get(),self.content_text.get(1.0, tkinter.END)))else:self.toplevel.destroy()tkinter.messagebox.showerror(提醒, 请选择修改对象)# 修改图书def modify_button(self, old_id, id, title, author, classify, inventory, content):if self.book.mod_book(old_id, id, title, author, classify, inventory, content):tkinter.messagebox.showinfo(提醒, 修改成功, parentself.toplevel)else:tkinter.messagebox.showerror(提醒, id重复, parentself.toplevel)# 添加图书def toplevel_submit(self):get_id self.id_entry.get()get_title self.title_entry.get()get_author self.author_entry.get()get_classify self.classify_entry.get()get_inventory self.inventory_entry.get()get_text self.content_text.get(1.0, tkinter.END)# print(get_id, get_title, get_author, get_classify, get_inventory, get_text)tip self.book.add_book(get_id, get_title, get_author, get_classify, get_inventory, get_text)if tip:tkinter.messagebox.showinfo(提醒, 添加成功, parentself.toplevel)else:tkinter.messagebox.showinfo(提醒, 书库中已存在此书, parentself.toplevel)# 借书窗口def borrow_toplevel(self):self.borrow_gui tkinter.Toplevel()gui_center(self.borrow_gui, width600, height500)self.book_id_borrow_label tkinter.Label(self.borrow_gui, textid, font(微软雅黑, 15, bold))self.book_id_borrow_entry tkinter.Entry(self.borrow_gui)self.book_id_borrow_label.place(relx0.35, rely0.1)self.book_id_borrow_entry.place(relx0.4, rely0.11)# 用户名self.user_borrow_label tkinter.Label(self.borrow_gui, text用户名, font(微软雅黑, 15, bold))self.user_borrow_entry tkinter.Entry(self.borrow_gui)self.user_borrow_label.place(relx0.28, rely0.22)self.user_borrow_entry.place(relx0.4, rely0.23)# 数量 默认 1 最多2本self.num_v tkinter.StringVar()self.num_borrow_option tkinter.ttk.OptionMenu(self.borrow_gui, self.num_v, 1)self.num_borrow_label tkinter.Label(self.borrow_gui, text数量, font(微软雅黑, 15, bold))self.num_borrow_book tkinter.Label(self.borrow_gui, text本, font(微软雅黑, 15, bold))self.num_borrow_label.place(relx0.29, rely0.33)self.num_borrow_option.place(relx0.4, rely0.34)self.num_borrow_book.place(relx0.48, rely0.33)# 时间 默认30天 最多2个月self.time_v tkinter.StringVar()self.time_borrow_option tkinter.ttk.OptionMenu(self.borrow_gui, self.time_v, 15, 30)self.time_borrow_label tkinter.Label(self.borrow_gui, text期限, font(微软雅黑, 15, bold))self.time_borrow_day tkinter.Label(self.borrow_gui, text天, font(微软雅黑, 15, bold))self.time_borrow_label.place(relx0.29, rely0.43)self.time_borrow_option.place(relx0.4, rely0.44)self.time_borrow_day.place(relx0.48, rely0.43)# 确认借书self.s_borrow_button tkinter.Button(self.borrow_gui, text提交, font(微软雅黑, 18, bold),commandself.borrow_about)self.s_borrow_button.place(relx0.4, rely0.53)# 借书def borrow_about(self):op_user UserOperation(1)op_record Record()op_book Book()v_id self.book_id_borrow_entry.get()v_user self.user_borrow_entry.get()t ComputingTime()# 打印输入结果print(v_id, v_user, self.num_v.get(), self.time_v.get())name op_book.query_book(v_id)# 首先查询图书if name:# 查借书用户if op_user.user_query(v_user):# 判断图书是否借完if int(name[0][inventory]) 0:tkinter.messagebox.showerror(提醒, 图书已借完, parentself.borrow_gui)return None# 判断用户是否还能借书if op_record.estimate_upper_limit(v_user):tkinter.messagebox.showerror(提醒, 用户借书已达到上限, parentself.borrow_gui)return None# 对图书数量修改num int(name[0][inventory]) - int(self.num_v.get())op_book.mod_book(v_id, name[0][id], name[0][title], name[0][author], name[0][classify],str(num),name[0][content])# 添加到记录中op_record.record_books.append({id: v_id, user: v_user, name: name[0][title], book_num: self.num_v.get(),borrow_time: t.current_time(),drop_time: t.return_book_time(int(self.time_v.get()))})op_record.write_record()tkinter.messagebox.showinfo(提醒, 借书成功!, parentself.borrow_gui)else:tkinter.messagebox.showerror(提醒, 无此用户, parentself.borrow_gui)else:tkinter.messagebox.showerror(提醒, 无此书, parentself.borrow_gui)# 还书窗口def drop_toplevel(self):self.drop_gui tkinter.Toplevel()gui_center(self.drop_gui, width300, height200)self.book_id_drop_label tkinter.Label(self.drop_gui, textid, font(微软雅黑, 15, bold))self.book_id_drop_entry tkinter.Entry(self.drop_gui)self.book_id_drop_label.place(relx0.2, rely0.1)self.book_id_drop_entry.place(relx0.3, rely0.11)# 用户名self.user_drop_label tkinter.Label(self.drop_gui, text用户名, font(微软雅黑, 15, bold))self.user_drop_entry tkinter.Entry(self.drop_gui)self.user_drop_label.place(relx0.09, rely0.25)self.user_drop_entry.place(relx0.3, rely0.26)self.s_drop_button tkinter.Button(self.drop_gui, text提交, font(微软雅黑, 18, bold),commandself.drop_about)self.s_drop_button.place(relx0.4, rely0.4)# 还书功能def drop_about(self):op_user UserOperation(1)op_record Record()op_book Book()v_id self.book_id_drop_entry.get()v_user self.user_drop_entry.get()name op_book.query_book(v_id)# 查图书if name:if op_user.user_query(v_user):all_drop_book op_record.drop_book(v_id, v_user)if not all_drop_book:tkinter.messagebox.showerror(提醒, 该用户无需还书, parentself.drop_gui)returnfor b in all_drop_book:# 对图书数量修改num int(name[0][inventory]) int(b[book_num])op_book.mod_book(b[id], b[id], name[0][title], name[0][author], name[0][classify],str(num),name[0][content])op_record.record_books.remove(b)op_record.write_record()tkinter.messagebox.showerror(提携, 还书成功, parentself.drop_gui)else:tkinter.messagebox.showerror(提醒, 无此用户, parentself.drop_gui)else:tkinter.messagebox.showerror(提醒, 无此图书, parentself.drop_gui)if __name__ __main__:root tkinter.Tk()style tkinter.ttk.Style()note tkinter.ttk.Notebook(root)main Admin()style.configure(TNotebook.Tab, font(微软雅黑, 20, bold), foregroundred)root.geometry(800x600450150)note.add(main.main_show_frame, text图书管理)note.pack(fillboth, expandtrue)root.mainloop()
用户管理
用户管理相当于把图书换成了用户其他都差不多。直接看代码。
import tkinter
from tkinter_book.other_fun.tip_entry import NewEntry
import tkinter.ttk
import tkinter.messagebox
from tkinter_book.other_fun.center_gui import gui_center
from tkinter_book.operation_data.user_operation import UserOperation对用户管理 添加 修改 删除
class ManagingUsers:def __init__(self):self.all_user UserOperation(1)self.show_user()def show_user(self):self.main_show_frame tkinter.Frame()about_frame tkinter.LabelFrame(self.main_show_frame, width160, height500, text功能区)show_book_frame tkinter.Frame(self.main_show_frame, width700, height700)self.tree tkinter.ttk.Treeview(show_book_frame, columns(user, password, state),showheadings, height20, selectmodebrowse)self.tree.heading(user, text用户名, anchorcenter)self.tree.heading(password, text密码, anchorcenter)self.tree.heading(state, text状态, anchorcenter)self.tree.column(user, anchorcenter, width80)self.tree.column(password, anchorcenter, width160)self.tree.column(state, anchorcenter, width120)for i in self.all_user.user_info[stu]:self.tree.insert(, tkinter.END, values(i[user], i[password], i[state]))# 搜索框按钮self.search_entry NewEntry(show_book_frame, 请输入用户名)self.search_button tkinter.Button(show_book_frame, text搜索, commandself.search_v)self.update_button tkinter.Button(show_book_frame, text刷新, commandself.update_user)self.search_entry.place(relx0.3, rely0.05)self.search_button.place(relx0.5, rely0.04)self.update_button.place(relx0.55, rely0.04)self.tree.place(relx0.15, rely0.1)show_book_frame.place(relx0.25, rely0.01)# 按钮样式button_style tkinter.ttk.Style()button_style.configure(TButton, font(微软雅黑, 18, bold), foregroundgrey, width8)# 添加add_button tkinter.ttk.Button(about_frame, text添加, styleTButton, commandlambda: self.show_toplevel(1))add_button.pack(pady20)# 修改mod_button tkinter.ttk.Button(about_frame, text修改, styleTButton, commandlambda: self.show_toplevel(2))mod_button.pack(pady20)# 删除del_button tkinter.ttk.Button(about_frame, text删除, styleTButton, commandself.del_user)del_button.pack(pady20)about_frame.pack_propagate(0)about_frame.place(relx0.03, rely0.01)def search_v(self):query self.all_user.user_query(self.search_entry.get_input_box())if query:for i in self.tree.get_children():self.tree.delete(i)self.tree.insert(, tkinter.END,values(query[user], query[password], query[state]))else:tkinter.messagebox.showerror(提携, 无查询结果!)# 删除图书def del_user(self):return_v self.tree.set(self.tree.focus())try:del_result self.all_user.user_del(return_v[user])if del_result:tkinter.messagebox.showinfo(提醒, 删除成功)except:tkinter.messagebox.showerror(提醒, 请选中删除目标)self.update_user()# 更新用户def update_user(self):all_user self.all_user.user_info[stu]for i in self.tree.get_children():self.tree.delete(i)for i in all_user:self.tree.insert(, tkinter.END,values(i[user], i[password], i[state]))def show_toplevel(self, flag)::param flag: 1 添加 2 修改:return:self.toplevel tkinter.Toplevel()gui_center(self.toplevel, width450, height400)user_label tkinter.Label(self.toplevel, text用户名, fgred, font(微软雅黑, 15, bold))self.user_entry tkinter.Entry(self.toplevel)user_label.pack(pady20)self.user_entry.pack()password_label tkinter.Label(self.toplevel, text密码, fgred, font(微软雅黑, 15, bold))self.password_entry tkinter.Entry(self.toplevel)password_label.pack(pady4)self.password_entry.pack()state_label tkinter.Label(self.toplevel, text状态, fgred, font(微软雅黑, 15, bold))self.state_entry tkinter.Entry(self.toplevel)state_label.pack(pady4)self.state_entry.pack()self.submit tkinter.Button(self.toplevel, text提交, fgred, font(微软雅黑, 15, bold),)self.submit.pack(pady15)# 添加if flag 1:self.submit.configure(commandself.toplevel_submit)# 修改if flag 2:itm self.tree.set(self.tree.focus())if itm:self.user_entry.insert(0, itm[user])self.user_entry.configure(statedisable)self.password_entry.insert(0, itm[password])self.state_entry.insert(0, itm[state])self.submit.configure(text修改,commandlambda: self.modify_button(itm[user], self.user_entry.get(), self.password_entry.get(),self.state_entry.get(),))else:self.toplevel.destroy()tkinter.messagebox.showerror(提醒, 请选择修改对象)# 用户名不准修改def modify_button(self, user, old_password, new_password, state0):if self.all_user.user_modify(user, old_password, new_password, state):tkinter.messagebox.showinfo(提醒, 修改成功, parentself.toplevel)else:tkinter.messagebox.showerror(提醒, 修改失败, parentself.toplevel)def toplevel_submit(self):get_user self.user_entry.get()get_password self.password_entry.get()get_state self.state_entry.get()tip self.all_user.user_add(get_user, get_password, get_state)if tip:tkinter.messagebox.showinfo(提醒, 添加成功, parentself.toplevel)else:tkinter.messagebox.showinfo(提醒, 此用户已存在, parentself.toplevel)if __name__ __main__:root tkinter.Tk()style tkinter.ttk.Style()note tkinter.ttk.Notebook(root)main ManagingUsers()style.configure(TNotebook.Tab, font(微软雅黑, 20, bold), foregroundred)root.geometry(800x600450150)note.add(main.main_show_frame, text用户管理)note.pack(fillboth, expandtrue)root.mainloop()
借书记录
管理员界面将显示所有用户的借书记录如果传入的flag值为1则表示普通用户只显示当前用户借的图书记录flag为2则显示所有用户借的图书记录。界面将会显示用户的借书时间以及归还时间。
from tkinter_book.operation_data.record_book import Record
import tkinter
import tkinter.ttk
import time
显示已经借出去书的记录
class LogMessage:def __init__(self, flag, userNone)::param flag: 1 普通用户 2 管理员:param user:self.flag flagself.user userself.show_gui()def show_gui(self):style tkinter.ttk.Style()style.configure(t.TLabel, font(微软雅黑, 18, bold), foregroundblue)if self.flag 1:self.main_show_frame tkinter.Frame()self.log_books Record()query_result self.log_books.query_user(self.user)result sorted(query_result, keylambda x: x[borrow_time], reverseTrue)for i, v in enumerate(result):tkinter.ttk.Label(self.main_show_frame, textv[id], stylet.TLabel).grid(rowi, column0, padx5,pady8)tkinter.ttk.Label(self.main_show_frame, textv[user], stylet.TLabel).grid(rowi, column1, padx5,pady8)tkinter.ttk.Label(self.main_show_frame, textv[name], stylet.TLabel).grid(rowi, column2, padx8)tkinter.ttk.Label(self.main_show_frame, text借, stylet.TLabel).grid(rowi, column3)tkinter.ttk.Label(self.main_show_frame, textself.handle_time(time.localtime(v[borrow_time])),stylet.TLabel).grid(rowi, column4)tkinter.ttk.Label(self.main_show_frame, text还, stylet.TLabel).grid(rowi, column5)tkinter.ttk.Label(self.main_show_frame, textself.handle_time(time.localtime(v[drop_time])),stylet.TLabel).grid(rowi, column6)print(借书时间, time.localtime(v[borrow_time])[:6], 还书时间, time.localtime(v[drop_time])[:6])if self.flag 2:self.main_show_frame tkinter.Frame()self.log_books Record()result sorted(self.log_books.record_books, keylambda x: x[borrow_time], reverseTrue)for i, v in enumerate(result):tkinter.ttk.Label(self.main_show_frame, textv[id], stylet.TLabel).grid(rowi, column0, padx5,pady8)tkinter.ttk.Label(self.main_show_frame, textv[user], stylet.TLabel).grid(rowi, column1, padx5,pady8)tkinter.ttk.Label(self.main_show_frame, textv[name], stylet.TLabel).grid(rowi, column2, padx8)tkinter.ttk.Label(self.main_show_frame, text借, stylet.TLabel).grid(rowi, column3)tkinter.ttk.Label(self.main_show_frame, textself.handle_time(time.localtime(v[borrow_time])),stylet.TLabel).grid(rowi, column4)tkinter.ttk.Label(self.main_show_frame, text还, stylet.TLabel).grid(rowi, column5)tkinter.ttk.Label(self.main_show_frame, textself.handle_time(time.localtime(v[drop_time])),stylet.TLabel).grid(rowi, column6)print(借书时间, time.localtime(v[borrow_time])[:6], 还书时间, time.localtime(v[drop_time])[:6])# 对时间格式修改 2023.7.21 18:05:12def handle_time(self, v_tuple):# 2023-7-24 15:20:30date str(v_tuple[0]) - str(v_tuple[1]) - str(v_tuple[2])specific str(v_tuple[3]) : str(v_tuple[4]) : str(v_tuple[5])# print(date specific)return date specificif __name__ __main__:root tkinter.Tk()style tkinter.ttk.Style()note tkinter.ttk.Notebook(root)main LogMessage(1, 123456)style.configure(TNotebook.Tab, font(微软雅黑, 20, bold), foregroundred)root.geometry(800x600450150)note.add(main.main_show_frame, text已借记录)note.pack(fillboth, expandtrue)root.mainloop()
更改密码
更改密码界面如果传入的值flag为1则是普通用户普通用户的id是不允许修改如果传入的值为2则是管理员管理员id允许修改user参数管理员可以不传。
import tkinter
import tkinter.ttk
from tkinter_book.operation_data.user_operation import UserOperation
import tkinter.messageboxclass ChangePassword:def __init__(self, user, flag):self.user userself.flag flagself.gui_change_password()def gui_change_password(self):self.change_frame tkinter.Frame()self.specific tkinter.Frame(self.change_frame, width450, height500)self.specific.pack_propagate(0)self.specific.pack()self.old_user_label tkinter.Label(self.specific, text用户名, font(微软雅黑, 18, bold))self.old_user_entry tkinter.Entry(self.specific, font(微软雅黑, 18, bold))self.old_label tkinter.Label(self.specific, text原密码, font(微软雅黑, 18, bold))self.old_entry tkinter.Entry(self.specific, font(微软雅黑, 18, bold))self.old_user_label.pack()self.old_user_entry.pack(pady5)self.old_label.pack()self.old_entry.pack(pady5)self.new_label tkinter.Label(self.specific, text新密码, font(微软雅黑, 18, bold))self.new_entry tkinter.Entry(self.specific, font(微软雅黑, 18, bold))self.new_label.pack()self.new_entry.pack(pady5)self.submit_button tkinter.Button(self.specific, text提交, font(微软雅黑, 20, bold),commandself.submit_determine)self.submit_button.pack(pady10)tip tkinter.Label(self.specific, textc站关注天天501, font(, 10, bold)).pack(sidebottom)if self.flag 1:# 插入用户名并且不准修改self.old_user_entry.insert(0, self.user)self.old_user_entry.configure(statedisable)def submit_determine(self):oper UserOperation(self.flag)# 获取值user_v self.old_user_entry.get()old_password self.old_entry.get()new_password self.new_entry.get()print(user_v, old_password, new_password)if oper.user_query(user_v):if oper.user_modify(user_v, old_password, new_password):self.old_user_entry.delete(0, end)self.old_entry.delete(0, end)self.new_entry.delete(0, end)tkinter.messagebox.showinfo(提醒, 修改成功)else:tkinter.messagebox.showerror(提醒, 密码错误)else:tkinter.messagebox.showerror(提醒, 无此用户)if __name__ __main__:root tkinter.Tk()style tkinter.ttk.Style()note tkinter.ttk.Notebook(root)change ChangePassword(,1)style.configure(TNotebook.Tab, font(微软雅黑, 20, bold), foregroundred)root.geometry(800x600450150)note.add(change.change_frame, text更改密码)note.pack(fillboth, expandtrue)root.mainloop()
普通用户界面
首页、搜索、消息、更改密码这四个界面其实和管理员界面大同小异这里就不过多的讲述了。
其他功能
数字时间显示
我们将用tkinter中的canvas模块来写一个类似数字闹钟的时间显示效果首先我们知道绘制一个数字最多需要七笔比如零假设我们从某一个笔开始如果这个数字有这个一笔那我们就绘制没有就跳过那我们就可以完美的将每一个数字绘制下来。draw_num()绘制单个数字将以上规律复现出来了。
import tkinter
from datetime import datetime
采用24进制 格式12:15
可以采用12小时进制 格式12:15
class Clock:def __init__(self, root, height15, width3, mode24):# 以左上角坐标为准# 画布的宽高self.width widthself.height height# 画布的粗细self.line_distance 5self.root rootself.canvas tkinter.Canvas(root, width150, height60)self.draw_clock()def draw_clock(self):# 删除之前绘制的self.canvas.delete(all)now datetime.now()# 获取时间string now.strftime(%H%M)# 小时self.draw_num(20, 10, int(string[0]))self.draw_num(20 self.height * 2, 10, int(string[1]))# 两个点self.draw_interval(20 self.height * 3.7, 20)self.draw_interval(20 self.height * 3.7, 35)# 分钟self.draw_num(20 self.height * 4.7, 10, int(string[2]))self.draw_num(20 self.height * 6.7, 10, int(string[3]))def draw_num(self, x, y, num0):# 总共分为7笔 每一笔if num in [2, 3, 4, 5, 6, 8, 9]:self.canvas.create_line(x self.height, y self.height, x, y self.height,widthself.width)if num in [0, 4, 5, 6, 8, 9]:self.canvas.create_line(x - self.line_distance, y self.height - self.line_distance,x - self.line_distance, y, widthself.width)if num in [0, 2, 3, 5, 6, 7, 8, 9]:self.canvas.create_line(x, y, x self.height, y, widthself.width)if num in [0, 1, 2, 3, 4, 7, 8, 9]:self.canvas.create_line(x self.line_distance self.height, y,x self.height self.line_distance,y self.height - self.line_distance,widthself.width)if num in [0, 1, 3, 4, 5, 6, 7, 8, 9]:self.canvas.create_line(x self.line_distance self.height,y self.height,x self.line_distance self.height, y self.height * 2,widthself.width)if num in [0, 2, 3, 5, 6, 8, 9]:self.canvas.create_line(x self.height, y self.height * 2,x, y self.height * 2,widthself.width)if num in [0, 2, 6, 8]:self.canvas.create_line(x - self.line_distance, y self.height * 2,x - self.line_distance, y self.height,widthself.width)def draw_interval(self, x, y):self.canvas.create_rectangle(x, y, x 5, y 5, fillblack)if __name__ __main__:root tkinter.Tk()root.geometry(500x500350150)n Clock(root)n.canvas.pack()root.mainloop()
加载画面显示
登录成功后会出现一个加载界面这个效果实现比较简单要用到Progressbar()创建进度条show()函数用for循环不断改变Progressbar()里面的值同时需要更新界面以达到动态显示的效果。当进度条加满时画面结束。
from tkinter_book.other_fun.center_gui import gui_center
import tkinter.ttk
import tkinter
import random
import timeclass Loading(tkinter.Tk):def __init__(self):super(Loading, self).__init__()# 居中显示gui_center(self, 100, 14)# 窗口透明self.attributes(-alpha, 0.8)# 无边框self.overrideredirect(True)self.loading_gui()self.mainloop()# 创建进度条def loading_gui(self):self.pro tkinter.ttk.Progressbar(self, value0, max100, length100)self.pro.pack()self.show()# 动态加载进度条def show(self):v random.randint(1, 5)for i in range(100):v random.randint(1, 16)self.pro.config(valuev)# 更新self.update()time.sleep(0.09)if v 100:print(结束了)self.destroy()returnif __name__ __main__:Loading()
输入框提示词
输入框提示词效果比较简单把Entry重写当光标不在的输入框的时候显示提示词光标在的时候就不显示最后我们还可以获取到输入框的值。
from tkinter import *class NewEntry(Entry):def __init__(self, masterNone, placeholder提示词, colorgrey):super().__init__(master)# 提示输入self.placeholder placeholderself.placeholder_color color# 输入框背景self.default_fg_color self[fg]# 光标聚集self.bind(FocusIn, self.foc_in)# 光标离开self.bind(FocusOut, self.foc_out)self.put_placeholder()# 重写插入提示词def put_placeholder(self):self.insert(0, self.placeholder)self[fg] self.placeholder_color# 光标在的时候 删除提示词def foc_in(self, *args):if self[fg] self.placeholder_color:self.delete(0, END)self[fg] self.default_fg_color# 光标离开插入提示词def foc_out(self, *args):if not self.get():self.put_placeholder()# 获取输入框的值def get_input_box(self):print(self.get())return self.get()
界面居中显示
首先获取屏幕的宽高那我们就有了界面宽高和屏幕的宽高那就很容易就能计算出界面居中的位置。
# 窗口居中
def gui_center(win, width300, height450):# 获取屏幕的宽高screen_width win.winfo_screenwidth()screen_height win.winfo_screenheight()x int(screen_width / 2 - width / 2)y int(screen_height / 2 - height / 2)win.geometry(f{width}x{height}{x}{y})借书时间和还书时间记录
这里用到了time模块用于记录时间根据时间戳来计算还书和借书的时间。
import timeclass ComputingTime:def __init__(self):pass# 返回当前时间def current_time(self):return time.time()# 还书时间def return_book_time(self, days):# 根据天数计算归还时间# print(time.localtime(self.current_time()self.count_second(30)))borrow self.current_time()return borrow self.count_second(days)# 计算十位时间戳def count_second(self, days):return int(days) * 24 * 60 * 60# 判断是否到了还书时间def compare(self, back):current self.current_time()if current back:return Trueelse:return Falseif __name__ __main__:clock ComputingTime()print(clock.return_book_time(20))
公告栏数据操作
公告栏比较简单当第一次运行时会写入数据并保存为json格式。当我们需要对数据进行操作时可以读取或写入以达到重新发布公告栏的效果。
import osdef first_write(txt关注天天501):name 公告栏.txtif not (name in os.listdir()):print(开始初次写入用户信息)with open(name, modew, encodingutf-8) as f:f.write(txt)return# 写入数据
def announcement_write(txt):with open(公告栏.txt, modew, encodingutf-8) as f:f.write(txt)# 读取数据
def announcement_read():with open(公告栏.txt, moder, encodingutf-8) as f:return f.read()
结尾
结束也是开始。本文到这就结束了想要完整代码的点赞关注私信我就可以了。感谢大家的支持和关注。 ————2023.8.11 21:00