今天我要和大家分享两个非常有趣的Python实战项目:一个是北京市2001-2017年水资源数据的可视化分析,另一个是图书馆书籍管理应用程序的开发。这两个项目都使用了Python的主流库,比如Pandas、Matplotlib和Tkinter,非常适合初学者学习和实践。资源绑定附上完整资料供读者参考学习!
我将从代码实现、功能讲解到实际应用,手把手带大家了解这两个项目的开发过程。无论是想提升数据分析能力,还是想学习图形用户界面设计,这篇文章都能帮到你!
项目一:北京市水资源数据可视化
1. 项目背景
北京市作为中国的首都,水资源的合理利用和管理一直是一个重要课题。通过分析2001-2017年的水资源数据,我们可以直观地了解水资源总量、人均水资源量、用水结构等信息,为水资源管理提供数据支持。
2. 数据预处理
首先,我们需要读取数据文件。这里使用了Python的open
函数,将CSV文件中的数据逐行读取并存储为一个列表。每行数据用逗号分隔,方便后续提取和处理。
Python
python
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
3. 可视化分析
我们使用Matplotlib库绘制了四个子图,分别展示不同维度的水资源数据。
子图1:全年水资源折线图
折线图非常适合展示趋势。我们提取了年份和三种水资源数据(总量、地表水、地下水),绘制了三条折线,分别用红色、绿色和蓝色表示。
Python
python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
#设置画布尺寸为12x12英寸,分辨率dpi为100像素
plt.figure(figsize=(12,12),dpi=100)
#画布总标题即图片总标题为"姓名+QQ号"
plt.suptitle('啊阿狸不会拉杆 2826848766',fontsize=35,fontweight='bold')
#子图1,绘制"全年水资源折线图"
subplot1=plt.subplot(2,2,1)
#子图1的标题"全年水资源折线图"
subplot1.set_title('全年水资源折线图')
#从列表中提取数据"年份"为x的取值
x=[int(x) for x in water_data_list[0][1:18]]
#分别从列表中提取"全年水资源总量","地表水资源","地下水资源",并转换成数字,原来是字符串
y1=[float(y1) for y1 in water_data_list[1][1:18]]
y2=[float(y2) for y2 in water_data_list[2][1:18]]
y3=[float(y3) for y3 in water_data_list[3][1:18]]
#分别开始绘制折线图的三条线,线型,颜色,标签与图例对应
subplot1.plot(x,y1,linestyle='-',color='r',label='全年水资源总量')
subplot1.plot(x,y2,linestyle='--',color='g',label='地表水资源量')
subplot1.plot(x,y3,linestyle=':',color='b',label='地下水资源量')
#添加横纵坐标的记号和标签,横轴年份(2001-2017),隔两年显示,斜体显示,纵轴(0-40),相隔5
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(0,40,9,endpoint=True))
plt.ylabel('亿立方米')
#图例放在左上
subplot1.legend(loc='upper left')
plt.show()
子图2:人均水资源量散点图
散点图可以直观地展示人均水资源量的分布情况。我们提取了人均水资源量数据,并用蓝色圆点表示。
Python
python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
#设置画布尺寸为12x12英寸,分辨率dpi为100像素
plt.figure(figsize=(12,12),dpi=100)
#画布总标题即图片总标题为"姓名+QQ号"
plt.suptitle('啊阿狸不会拉杆 2826848766',fontsize=35,fontweight='bold')
#子图1,绘制"全年水资源折线图"
subplot1=plt.subplot(2,2,1)
#子图1的标题"全年水资源折线图"
subplot1.set_title('全年水资源折线图')
#从列表中提取数据"年份"为x的取值
x=[int(x) for x in water_data_list[0][1:18]]
#分别从列表中提取"全年水资源总量","地表水资源","地下水资源",并转换成数字,原来是字符串
y1=[float(y1) for y1 in water_data_list[1][1:18]]
y2=[float(y2) for y2 in water_data_list[2][1:18]]
y3=[float(y3) for y3 in water_data_list[3][1:18]]
#分别开始绘制折线图的三条线,线型,颜色,标签与图例对应
subplot1.plot(x,y1,linestyle='-',color='r',label='全年水资源总量')
subplot1.plot(x,y2,linestyle='--',color='g',label='地表水资源量')
subplot1.plot(x,y3,linestyle=':',color='b',label='地下水资源量')
#添加横纵坐标的记号和标签,横轴年份(2001-2017),隔两年显示,斜体显示,纵轴(0-40),相隔5
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(0,40,9,endpoint=True))
plt.ylabel('亿立方米')
#图例放在左上
subplot1.legend(loc='upper left')
#子图2,绘制人均水资源量散点图
subplot2=plt.subplot(2,2,2)
#子图2标题"人均水资源量散点图"
subplot2.set_title('人均水资源量散点图')
#从列表中提取出人均水资源量数据并转化成数字,原来是字符串
y_2=[float(y_2) for y_2 in water_data_list[4][1:18]]
#绘制散点图,点的类型为circle'o',颜色为蓝色,图例为"人均水资源(立方米/人)"
subplot2.scatter(x,y_2,marker='o',color='b',label='人均水资源(立方米/人)')
#显示图例,在右上角
subplot2.legend(loc='upper right')
#横纵坐标的记号和标签,纵轴(100-200),相隔10
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(100,200,11,endpoint=True))
plt.ylabel('立方米/人')
plt.show()

子图3:2017年用水饼图
饼图非常适合展示比例关系。我们提取了2017年的用水数据,分别展示农业、工业、生活和生态环境用水的比例。
Python
python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
#设置画布尺寸为12x12英寸,分辨率dpi为100像素
plt.figure(figsize=(12,12),dpi=100)
#画布总标题即图片总标题为"姓名+QQ号"
plt.suptitle('啊阿狸不会拉杆 2826848766',fontsize=35,fontweight='bold')
#子图1,绘制"全年水资源折线图"
subplot1=plt.subplot(2,2,1)
#子图1的标题"全年水资源折线图"
subplot1.set_title('全年水资源折线图')
#从列表中提取数据"年份"为x的取值
x=[int(x) for x in water_data_list[0][1:18]]
#分别从列表中提取"全年水资源总量","地表水资源","地下水资源",并转换成数字,原来是字符串
y1=[float(y1) for y1 in water_data_list[1][1:18]]
y2=[float(y2) for y2 in water_data_list[2][1:18]]
y3=[float(y3) for y3 in water_data_list[3][1:18]]
#分别开始绘制折线图的三条线,线型,颜色,标签与图例对应
subplot1.plot(x,y1,linestyle='-',color='r',label='全年水资源总量')
subplot1.plot(x,y2,linestyle='--',color='g',label='地表水资源量')
subplot1.plot(x,y3,linestyle=':',color='b',label='地下水资源量')
#添加横纵坐标的记号和标签,横轴年份(2001-2017),隔两年显示,斜体显示,纵轴(0-40),相隔5
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(0,40,9,endpoint=True))
plt.ylabel('亿立方米')
#图例放在左上
subplot1.legend(loc='upper left')
#子图2,绘制人均水资源量散点图
subplot2=plt.subplot(2,2,2)
#子图2标题"人均水资源量散点图"
subplot2.set_title('人均水资源量散点图')
#从列表中提取出人均水资源量数据并转化成数字,原来是字符串
y_2=[float(y_2) for y_2 in water_data_list[4][1:18]]
#绘制散点图,点的类型为circle'o',颜色为蓝色,图例为"人均水资源(立方米/人)"
subplot2.scatter(x,y_2,marker='o',color='b',label='人均水资源(立方米/人)')
#显示图例,在右上角
subplot2.legend(loc='upper right')
#横纵坐标的记号和标签,纵轴(100-200),相隔10
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(100,200,11,endpoint=True))
plt.ylabel('立方米/人')
#子图3,2017年用水饼图
subplot3=plt.subplot(2,2,3)
#子图3标题"2017年用水量饼图"
subplot3.set_title('2017年用水量饼图')
#各个饼的标签
label_3=['农业用水','工业用水','生活用水','生态环境用水']
#列表value用来存放2017年的"农业用水","工业用水","生活用水","生态环境用水量"
value=[]
for i in range(11,15):
value.append(float(water_data_list[i][17]))
#绘制饼图,颜色按示例来对应,各个饼间距为01,百分比显示格式为小数点后保留2位
subplot3.pie(value,colors=['steelblue','darkorange','g','red'],labels=label_3,autopct='%1.2f%%',explode=[0.01,0.01,0.01,0.01])
plt.show()

子图4:万元地区生产总值耗水量箱线图
箱线图可以展示数据的分布情况,包括中位数、四分位数和离群值。我们提取了2001-2017年的耗水量数据,并绘制了箱线图。
Python
python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
#设置画布尺寸为12x12英寸,分辨率dpi为100像素
plt.figure(figsize=(12,12),dpi=100)
#画布总标题即图片总标题为"姓名+QQ号"
plt.suptitle('啊阿狸不会拉杆 2826848766',fontsize=35,fontweight='bold')
#绘制子图4,2001-2017年万元地区生产总值耗水量箱线图
subplot4=plt.subplot(2,2,4)
#子图4总标题为"2001-2017年万元地区生产总值耗水量箱线图"
subplot4.set_title('2001-2017年万元地区生产总值耗水量箱线图')
#列表用来存放"2001-2017年万元地区生产总值耗水量"数据
data_4=[]
for i in range(1,18):
data_4.append(float(water_data_list[15][i]))
#绘制箱线图,notch=Ture凹口的形式展现箱线图,用线的形式表示均值
subplot4.boxplot(data_4,notch=True,meanline='-')
#横轴标签和纵轴记号
plt.xlabel('万元地区生产总值耗水量(立方米)')
plt.yticks(np.linspace(0,100,6,endpoint=True))
#保存图片为"我的姓名+QQ号",即"啊阿狸不会拉杆 2826848766"
#plt.savefig('啊阿狸不会拉杆 2826848766')
#展示画布
plt.show()

最终效果
将四个子图组合在一起,形成了一个完整的可视化分析图。每个子图都清晰地展示了不同维度的水资源数据。

python
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] = False
#将文件全部内容读取出来放入列表中,每个元素为一行字符串,用逗号隔开
with open('2001-2017年北京市水资源情况信息.csv','r',encoding='GBK') as file:
water_data_list=[line.strip().split(',') for line in file]
#设置画布尺寸为12x12英寸,分辨率dpi为100像素
plt.figure(figsize=(12,12),dpi=100)
#画布总标题即图片总标题为"姓名+QQ号"
plt.suptitle('啊阿狸不会拉杆 2826848766',fontsize=35,fontweight='bold')
#子图1,绘制"全年水资源折线图"
subplot1=plt.subplot(2,2,1)
#子图1的标题"全年水资源折线图"
subplot1.set_title('全年水资源折线图')
#从列表中提取数据"年份"为x的取值
x=[int(x) for x in water_data_list[0][1:18]]
#分别从列表中提取"全年水资源总量","地表水资源","地下水资源",并转换成数字,原来是字符串
y1=[float(y1) for y1 in water_data_list[1][1:18]]
y2=[float(y2) for y2 in water_data_list[2][1:18]]
y3=[float(y3) for y3 in water_data_list[3][1:18]]
#分别开始绘制折线图的三条线,线型,颜色,标签与图例对应
subplot1.plot(x,y1,linestyle='-',color='r',label='全年水资源总量')
subplot1.plot(x,y2,linestyle='--',color='g',label='地表水资源量')
subplot1.plot(x,y3,linestyle=':',color='b',label='地下水资源量')
#添加横纵坐标的记号和标签,横轴年份(2001-2017),隔两年显示,斜体显示,纵轴(0-40),相隔5
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(0,40,9,endpoint=True))
plt.ylabel('亿立方米')
#图例放在左上
subplot1.legend(loc='upper left')
#子图2,绘制人均水资源量散点图
subplot2=plt.subplot(2,2,2)
#子图2标题"人均水资源量散点图"
subplot2.set_title('人均水资源量散点图')
#从列表中提取出人均水资源量数据并转化成数字,原来是字符串
y_2=[float(y_2) for y_2 in water_data_list[4][1:18]]
#绘制散点图,点的类型为circle'o',颜色为蓝色,图例为"人均水资源(立方米/人)"
subplot2.scatter(x,y_2,marker='o',color='b',label='人均水资源(立方米/人)')
#显示图例,在右上角
subplot2.legend(loc='upper right')
#横纵坐标的记号和标签,纵轴(100-200),相隔10
plt.xticks(np.linspace(2001,2017,9,endpoint=True),rotation=45)
plt.xlabel('年份')
plt.yticks(np.linspace(100,200,11,endpoint=True))
plt.ylabel('立方米/人')
#子图3,2017年用水饼图
subplot3=plt.subplot(2,2,3)
#子图3标题"2017年用水量饼图"
subplot3.set_title('2017年用水量饼图')
#各个饼的标签
label_3=['农业用水','工业用水','生活用水','生态环境用水']
#列表value用来存放2017年的"农业用水","工业用水","生活用水","生态环境用水量"
value=[]
for i in range(11,15):
value.append(float(water_data_list[i][17]))
#绘制饼图,颜色按示例来对应,各个饼间距为01,百分比显示格式为小数点后保留2位
subplot3.pie(value,colors=['steelblue','darkorange','g','red'],labels=label_3,autopct='%1.2f%%',explode=[0.01,0.01,0.01,0.01])
#绘制子图4,2001-2017年万元地区生产总值耗水量箱线图
subplot4=plt.subplot(2,2,4)
#子图4总标题为"2001-2017年万元地区生产总值耗水量箱线图"
subplot4.set_title('2001-2017年万元地区生产总值耗水量箱线图')
#列表用来存放"2001-2017年万元地区生产总值耗水量"数据
data_4=[]
for i in range(1,18):
data_4.append(float(water_data_list[15][i]))
#绘制箱线图,notch=Ture凹口的形式展现箱线图,用线的形式表示均值
subplot4.boxplot(data_4,notch=True,meanline='-')
#横轴标签和纵轴记号
plt.xlabel('万元地区生产总值耗水量(立方米)')
plt.yticks(np.linspace(0,100,6,endpoint=True))
#保存图片为"我的姓名+QQ号",即"啊阿狸不会拉杆 2826848766"
plt.savefig('啊阿狸不会拉杆 2826848766')
#展示画布
plt.show()

项目二:图书馆书籍管理应用程序
1. 项目背景
图书馆书籍管理是日常生活中非常常见的场景。通过开发一个简单的书籍管理应用程序,我们可以学习如何使用Python的Tkinter库创建图形用户界面,并实现添加、删除和修改书籍信息的功能。
2. 功能实现
书籍类和图书馆类
我们首先定义了两个类:Book
类用于存储书籍信息,Library
类用于管理书籍列表。
Python
class Book:
def __init__(self, title, author, isbn):
self.title = title
self.author = author
self.isbn = isbn
def __str__(self):
return f"{self.title} by {self.author}, ISBN: {self.isbn}"
class Library:
def __init__(self):
self.books = []
def add_book(self, book):
self.books.append(book)
return True
def remove_book(self, isbn):
for book in self.books:
if book.isbn == isbn:
self.books.remove(book)
return True
return False
def update_book(self, isbn, new_title=None, new_author=None):
for book in self.books:
if book.isbn == isbn:
if new_title:
book.title = new_title
if new_author:
book.author = new_author
return True
return False
图书馆应用程序界面
我们使用Tkinter创建了一个图形用户界面,包括输入框、按钮和列表框。
Python
class LibraryApp:
def __init__(self, master, name, student_id):
self.master = master
self.name = name
self.student_id = student_id
self.library = Library()
self.master.geometry('1000x500')
self.create_widgets()
def create_widgets(self):
tk.Label(self.master, text=f"图书馆书籍管理应用程序 - {self.name} {self.student_id}", font=('Arial', 16)).pack()
tk.Label(self.master, text="书名:").pack()
self.title_entry = tk.Entry(self.master)
self.title_entry.pack()
tk.Label(self.master, text="作者:").pack()
self.author_entry = tk.Entry(self.master)
self.author_entry.pack()
tk.Label(self.master, text="ISBN(国际标准书号):").pack()
self.isbn_entry = tk.Entry(self.master)
self.isbn_entry.pack()
tk.Button(self.master, text="添加书籍", command=self.add_book).pack()
tk.Button(self.master, text="删除书籍", command=self.remove_book).pack()
tk.Button(self.master, text="修改书籍", command=self.update_book).pack()
tk.Button(self.master, text="书籍清单:", command=self.refresh_list).pack(anchor=tk.W)
self.listbox = Listbox(self.master, width=125, height=11)
self.listbox.pack()
self.refresh_list()
添加、删除和修改书籍
我们实现了三个核心功能:添加书籍、删除书籍和修改书籍信息。
Python
def add_book(self):
title = self.title_entry.get()
author = self.author_entry.get()
isbn = self.isbn_entry.get()
if title and author and isbn:
new_book = Book(title, author, isbn)
if self.library.add_book(new_book):
messagebox.showinfo("成功", "书籍添加成功!")
self.refresh_list()
self.clear_entries()
else:
messagebox.showerror("错误", "书籍添加失败")
else:
messagebox.showwarning("提示", "信息不完整,还需完善")
def remove_book(self):
isbn = self.isbn_entry.get()
if isbn:
if self.library.remove_book(isbn):
messagebox.showinfo("成功", "删除书籍成功!")
self.refresh_list()
self.clear_entries()
else:
messagebox.showerror("失败", "未找到对应书籍。")
else:
messagebox.showwarning("提示", "需要提供ISBN码")
def update_book(self):
isbn = self.isbn_entry.get()
new_title = self.title_entry.get()
new_author = self.author_entry.get()
if isbn:
if self.library.update_book(isbn, new_title, new_author):
messagebox.showinfo("成功", "书籍修改成功!")
self.refresh_list()
self.clear_entries()
else:
messagebox.showerror("失败", "未找到对应书籍")
else:
messagebox.showwarning("提示", "需要提供ISBN码")
3. 程序运行效果
运行程序后,我们会看到一个简洁的图形界面。用户可以通过输入框添加书籍信息,也可以通过ISBN删除或修改书籍信息。所有书籍都会显示在列表框中,方便查看和管理。
python
import tkinter as tk
from tkinter import messagebox, Listbox
# 定义书籍类
class Book:
#title,anthor,isbn分别表示书籍的书名,作者,国际标准书号
def __init__(self, title, author, isbn):
#把传进来的三个参数分别赋给书籍类的实例对象的三个属性
self.title = title
self.author = author
self.isbn = isbn
def __str__(self):
#返回对象的属性
return f"{self.title} by {self.author}, ISBN: {self.isbn}"
# 定义图书馆类
class Library:
def __init__(self):
#创建books列表存放书籍的数据
self.books = []
#定义添加书籍的方法
def add_book(self, book):
#存放到books列表里
self.books.append(book)
return True
#定义删除书籍的方法(用国际标准书号检索并删除)
def remove_book(self, isbn):
#遍历书籍列表里的书籍
for book in self.books:
#如果书籍的国际标准书号isbn与输入isbn一致
if book.isbn == isbn:
#把相应书籍从列表里删除
self.books.remove(book)
return True
return False
#定义修改书籍信息方法(通过国际标准书号检索,把书名或作者修改掉)
def update_book(self, isbn, new_title=None, new_author=None):
#遍历书籍列表里的书籍
for book in self.books:
#如果isbn一致
if book.isbn == isbn:
# 且修改书名非空
if new_title:
#把书籍的书名修改
book.title = new_title
#且修改作者非空
if new_author:
#把书籍的作者修改
book.author = new_author
return True
return False
# 定义图书馆应用程序类(也是用户界面的主界面)
class LibraryApp:
def __init__(self, master, name, student_id):
#对Tk()函数创建的窗口对象master(或者是常用的root)的属性赋值
self.master = master
#我的名字
self.name = name
#我的学号
self.student_id = student_id
#图书馆类
self.library = Library()
#窗口大小设为(1000x500)像素,即宽1000像素,高500像素
self.master.geometry('1000x500')
#创建界面中的控件(类),包括创建标签,输入框,按钮
self.create_widgets()
#创建界面中的控件(类)
def create_widgets(self):
# 创建一个标题
tk.Label(self.master, text=f"图书馆书籍管理应用程序 - {self.name} {self.student_id}", font=('Arial', 16)).pack()
# 创建一个输入框并显示"书名"
tk.Label(self.master, text="书名:").pack()
#创建供用户输入"书名"的输入框控件
self.title_entry = tk.Entry(self.master)
self.title_entry.pack()
# 创建一个输入框并显示"作者"
tk.Label(self.master, text="作者:").pack()
# 创建供用户输入"作者"的输入框控件
self.author_entry = tk.Entry(self.master)
self.author_entry.pack()
# 创建一个输入框并显示"国际标准书号"
tk.Label(self.master, text="ISBN(国际标准书号):").pack()
# 创建供用户输入"国际标准书号"的输入框控件
self.isbn_entry = tk.Entry(self.master)
self.isbn_entry.pack()
# 创建按钮,text设置按钮上显示文本,command指定按钮被点击时执行的函数(命令),pack()方法把按钮添加到窗口
#四个按钮分别是添加,删除,修改书籍和书籍清单,前三个居中,书籍清单按钮放置左边tk.W
tk.Button(self.master, text="添加书籍", command=self.add_book).pack()
tk.Button(self.master, text="删除书籍", command=self.remove_book).pack()
tk.Button(self.master, text="修改书籍", command=self.update_book).pack()
tk.Button(self.master, text="书籍清单:", command=self.refresh_list).pack(anchor=tk.W)
# 创建列表框,放置书籍,宽125,高11,也可适当调整,都行
self.listbox = Listbox(self.master, width=125, height=11)
self.listbox.pack()
#刷新书籍清单(自定义方法)
self.refresh_list()
#添加书籍(方法)
def add_book(self):
#从tk.Entry控件获取对应文本,get()方法读取文本
title = self.title_entry.get()
author = self.author_entry.get()
isbn = self.isbn_entry.get()
#如果书名,作者,国际标准书号均非空
if title and author and isbn:
#调用Book()方法添加书籍
new_book = Book(title, author, isbn)
#是否添加成功
if self.library.add_book(new_book):
#成功时输出"书籍添加成功"
messagebox.showinfo("成功", "书籍添加成功!")
#刷新书籍清单
self.refresh_list()
#清除输入框中的文本,让用户多次输入
self.clear_entries()
#添加失败并打印"书籍添加失败"
else:
messagebox.showerror("错误", "书籍添加失败")
#提供的信息不完整
else:
messagebox.showwarning("提示", "信息不完整,还需完善")
#删除书籍(方法),用国际标准书号来检索
def remove_book(self):
#传值,国际标准书号
isbn = self.isbn_entry.get()
#如果输入的isbn非空
if isbn:
#调用图书馆里删除书籍的方法
if self.library.remove_book(isbn):
messagebox.showinfo("成功", "删除书籍成功!")
#刷新书籍清单
self.refresh_list()
#清除输入框中的文本,让用户多次输入
self.clear_entries()
#调用方法却找不到对应书籍
else:
messagebox.showerror("失败", "未找到对应书籍。")
#输入的isbn码为空
else:
messagebox.showwarning("提示", "需要提供ISBN码")
#修改书籍(方法),用国际标准书号检索
def update_book(self):
#传值,国际标准书号,新书名,新作者
isbn = self.isbn_entry.get()
new_title = self.title_entry.get()
new_author = self.author_entry.get()
#如果isbn码非空
if isbn:
#调用图书馆修改书籍方法()
if self.library.update_book(isbn, new_title, new_author):
#调用修改书籍方法
messagebox.showinfo("成功", "书籍修改成功!")
#刷新书籍清单
self.refresh_list()
#清除输入框的文本,让用户多次输入
self.clear_entries()
#调用失败,找不到书籍
else:
messagebox.showerror("失败", "未找到对应书籍")
else:
messagebox.showwarning("提示", "需要提供ISBN码")
#刷新清单(方法)
def refresh_list(self):
#从控件中删除所有项目
self.listbox.delete(0, tk.END)
#遍历图书馆中的书籍
for book in self.library.books:
#把书籍嵌入清单
self.listbox.insert(tk.END, str(book))
#清空输入框文本(方法),让用户多次输入
def clear_entries(self):
#分别删除书名,作者,isbn控件中(输入)项目的
self.title_entry.delete(0, tk.END)
self.author_entry.delete(0, tk.END)
self.isbn_entry.delete(0, tk.END)
# 主函数
def main():
#创建窗口对象
root = tk.Tk()
#窗口标题
root.title("图书馆书籍管理应用程序")
#调用图书馆应用程序类
app = LibraryApp(root, "啊阿狸不会拉杆", "2826848766")
#窗口程序主循环,使窗口停留
root.mainloop()
if __name__ == "__main__":
main()

总结
通过这两个项目,我们不仅学会了如何使用Python进行数据可视化和图形用户界面开发,还掌握了数据分析和应用程序设计的基本思路。无论是水资源数据的可视化分析,还是图书馆书籍管理的应用开发,Python都能提供强大的工具支持。
希望大家能从这两个项目中获得启发,尝试用自己的数据和创意开发更多有趣的应用!如果有任何问题或建议,欢迎在评论区留言交流!资源绑定附上完整资料供读者参考学习!