第十八章:Python实战专题:北京市水资源数据可视化与图书馆书籍管理应用开发

今天我要和大家分享两个非常有趣的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()

最终效果

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

![北京市水资源数据可视化](啊阿狸不会拉杆 2826848766.png)

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都能提供强大的工具支持。

希望大家能从这两个项目中获得启发,尝试用自己的数据和创意开发更多有趣的应用!如果有任何问题或建议,欢迎在评论区留言交流!资源绑定附上完整资料供读者参考学习!

相关推荐
Yeauty2 分钟前
Rust 中的高效视频处理:利用硬件加速应对高分辨率视频
开发语言·rust·ffmpeg·音视频·音频·视频
落榜程序员3 分钟前
Java 基础-30-单例设计模式:懒汉式与饿汉式
java·开发语言
划水哥~7 分钟前
创建QMainWindow菜单栏
开发语言·c++·qt
矿渣渣8 分钟前
int main(int argc, char **argv)C语言主函数参数解析
c语言·开发语言
阿让啊11 分钟前
bootloader+APP中,有些APP引脚无法正常使用?
c语言·开发语言·stm32·单片机·嵌入式硬件
饕餮ing15 分钟前
C++的UDP连接解析域名地址错误
开发语言·c++·udp
莲动渔舟16 分钟前
Nyquist插件基础:打印格式化字符串(LISP语言)
开发语言·lisp·音频处理·audacity
满怀101528 分钟前
Python入门(5):异常处理
开发语言·python
莓事哒28 分钟前
使用pytesseract和Cookie登录古诗文网~(python爬虫)
爬虫·python·pycharm·cookie·pytessarct
攀小黑31 分钟前
Java 多线程加锁 synchronized 关键字 字符串当做key
java·开发语言