第十八章:Python實戰專題:北京市水資源數據可視化與圖書館書籍管理應用開發

? ? 今天我要和大家分享兩個非常有趣的Python實戰項目:一個是北京市2001-2017年水資源數據的可視化分析,另一個是圖書館書籍管理應用程序的開發。這兩個項目都使用了Python的主流庫,比如Pandas、Matplotlib和Tkinter,非常適合初學者學習和實踐。資源綁定附上完整資料供讀者參考學習!

我將從代碼實現、功能講解到實際應用,手把手帶大家了解這兩個項目的開發過程。無論是想提升數據分析能力,還是想學習圖形用戶界面設計,這篇文章都能幫到你!

項目一:北京市水資源數據可視化

1. 項目背景

北京市作為中國的首都,水資源的合理利用和管理一直是一個重要課題。通過分析2001-2017年的水資源數據,我們可以直觀地了解水資源總量、人均水資源量、用水結構等信息,為水資源管理提供數據支持。

2. 數據預處理

首先,我們需要讀取數據文件。這里使用了Python的open函數,將CSV文件中的數據逐行讀取并存儲為一個列表。每行數據用逗號分隔,方便后續提取和處理。

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

import matplotlib.pyplot as plt
import numpy as np
import matplotlibmatplotlib.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

import matplotlib.pyplot as plt
import numpy as np
import matplotlibmatplotlib.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

import matplotlib.pyplot as plt
import numpy as np
import matplotlibmatplotlib.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

import matplotlib.pyplot as plt
import numpy as np
import matplotlibmatplotlib.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)

import matplotlib.pyplot as plt
import numpy as np
import matplotlibmatplotlib.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 = titleself.author = authorself.isbn = isbndef __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 Truedef remove_book(self, isbn):for book in self.books:if book.isbn == isbn:self.books.remove(book)return Truereturn Falsedef 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_titleif new_author:book.author = new_authorreturn Truereturn False

圖書館應用程序界面

我們使用Tkinter創建了一個圖形用戶界面,包括輸入框、按鈕和列表框。

Python

class LibraryApp:def __init__(self, master, name, student_id):self.master = masterself.name = nameself.student_id = student_idself.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刪除或修改書籍信息。所有書籍都會顯示在列表框中,方便查看和管理。

import tkinter as tk
from tkinter import messagebox, Listbox# 定義書籍類
class Book:#title,anthor,isbn分別表示書籍的書名,作者,國際標準書號def __init__(self, title, author, isbn):#把傳進來的三個參數分別賦給書籍類的實例對象的三個屬性self.title = titleself.author = authorself.isbn = isbndef __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 Truereturn 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_authorreturn Truereturn 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.Wtk.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都能提供強大的工具支持。

希望大家能從這兩個項目中獲得啟發,嘗試用自己的數據和創意開發更多有趣的應用!如果有任何問題或建議,歡迎在評論區留言交流!資源綁定附上完整資料供讀者參考學習!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75235.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75235.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75235.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

音視頻基礎(音視頻的錄制和播放原理)

文章目錄 一、錄制原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 二、播放原理**1. 音視頻數據解析****2. 音頻處理流程****3. 視頻處理流程****4. 同步控制****5. 關鍵技術點****總結** 一、錄制原理 這張圖展示…

Nginx多域名HTTPS配置全攻略:從證書生成到客戶端安裝

一、業務背景 在現代Web開發中,HTTPS已成為保障數據傳輸安全的標準協議。特別是對于地圖類API服務(如高德地圖),往往需要同時支持多個子域名(如webapi.amap.com、restapi.amap.com等)的HTTPS訪問。傳統方式…

Redis原理:rename命令

RENAME key newkey 將一個key重命名為新key,如果key不存在,則會返回異常。如果newKey已經存在,則會被覆蓋,其實newKey會被顯示的刪除,所以如果newKey是一個大key,則會引起延遲。 源碼 void renameCommand…

k8s污點與容忍

k8s污點與容忍 k8s污點管理常用命令effect標記值查看污點添加污點刪除污點 node污點與容忍污點容忍yaml示例容忍放大基于污點的驅逐驅逐時排除指定服務 設置master調度設置master盡量不調度允許master節點調度pod恢復Master Only狀態將node標記為不可調度狀態(節點警戒)設置nod…

(BFS)題解:P9425 [藍橋杯 2023 國 B] AB 路線

題解:P9425 [藍橋杯 2023 國 B] AB 路線 題目傳送門 P9425 [藍橋杯 2023 國 B] AB 路線 一、題目描述 給定一個NM的迷宮,每個格子標記為A或B。從左上角(1,1)出發,需要移動到右下角(N,M)。移動規則是:必須交替走K個A格子和K個B…

python-leetcode 62.搜索插入位置

題目: 給定一個排序數組和一個目標值,在數組中找到目標值,并返回其索引。如果目標值不存在于數組中,返回它將會被按順序插入的位置 方法一:二分查找 假設題意是在排序數組中尋找是否存在一個目標值,則可以…

【計網速通】計算機網絡核心知識點和高頻考點——數據鏈路層(一)

數據鏈路層核心知識點(一) 一、數據鏈路層概述 1.1 基本概念 數據鏈路層位于OSI模型的第二層,介于物理層和網絡層之間,主要負責在相鄰節點之間傳輸和識別數據幀。 1.2 主要功能 幀同步:識別幀的開始和結束差錯控制…

模型部署與調用

目錄 部署 ollama下載 模型版本選擇 ?編輯 對照表 控制臺執行 調用 部署 大模型部署我使用的是Ollama,點擊跳轉 接下來我將在本地使用ollama就行模型部署的演示 ollama下載 模型版本選擇 對照表 大家可以根據自己的顯卡配置選擇對應的模型版本 控制臺執…

Rstudio如何使用Conda環境配置的R

前言 Rstudio作為一款流行的R語言集成開發環境(IDE),為用戶提供了便捷的編程體驗。然而,不同項目可能需要不同版本的R,這就需要我們靈活切換R版本。除了在之前文章中提到的使用 Docker 部署不同版本的 R 的方法之外&am…

C++---RAII模式

一、RAII模式概述 1. 定義 RAII(Resource Acquisition Is Initialization)即資源獲取即初始化,是C中用于管理資源生命周期的一種重要編程模式。其核心在于將資源的獲取和釋放操作與對象的生命周期緊密綁定。當對象被創建時,資源…

【功能開發】DSP F2837x 檢測中斷所有函數運行一次的時間

要查看 DSP F28377 的 CPU 在 50 微秒一次的中斷內所有程序運行完總共占用了中斷多長時間,可以采用硬件定時器測量和軟件計時兩種常見方法。 方法一:使用硬件定時器測量 原理 利用 DSP 內部的高精度硬件定時器,在中斷開始時記錄定時器的值…

MAC環境給docker換源

2025-03-28 MAC環境給docker換源 在官網下載docker ,dmg 文件 參考: https://blog.csdn.net/qq_73162098/article/details/145014490 {"builder": {"gc": {"defaultKeepStorage": "20GB","enabled": true}},&q…

Vulnhub-zico2靶機打靶記錄

本篇文章旨在為網絡安全滲透測試靶機教學。通過閱讀本文,讀者將能夠對滲透Vulnhub系列zico2靶機有一定的了解 一、信息收集階段 靶機下載地址:https://download.vulnhub.com/zico/zico2.ova 因為靶機為本地部署虛擬機網段,查看dhcp地址池設…

【LeetCode 熱題100】347:前 K 個高頻元素(詳細解析)(Go語言版)

🚀 力扣熱題 347:前 K 個高頻元素(詳細解析) 📌 題目描述 力扣 347. 前 K 個高頻元素 給你一個整數數組 nums 和一個整數 k,請你返回其中出現頻率 前 k 高的元素。你可以按 任意順序 返回答案。 &#x1f…

Java 大視界 -- Java 大數據機器學習模型在金融衍生品定價中的創新方法與實踐(166)

💖親愛的朋友們,熱烈歡迎來到 青云交的博客!能與諸位在此相逢,我倍感榮幸。在這飛速更迭的時代,我們都渴望一方心靈凈土,而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識,也…

深度學習入門:從神經網絡基礎到簡單實現

深度學習作為人工智能領域最令人興奮的技術之一,已經在圖像識別、自然語言處理、語音識別等多個領域取得了突破性進展。本文將深入淺出地介紹深度學習的基本概念,并通過Python代碼實現一個簡單的神經網絡模型,幫助讀者建立直觀理解并邁出實踐第一步。 神經網絡的基本原理 …

第2.6節 iOS生成全量和增量報告

2.6.1 簡介 在采集了覆蓋率數據后,就需要生成對應需求的全量和增量覆蓋率報告,以便對測試進行查漏補缺。IOS系統有兩種開發語言,所以生成報告的方式也不相同,下面就分別介紹一下Object C和Swift語言如何生成覆蓋率報告。 2.6.2 O…

STM32技能綜合鞏固

一、深入理解ARMCPU架構及其指令格式、ARM匯編語言編程方法 1.匯編語言編程,實現LED燈 新建keil項目,選擇芯片 選擇運行環境以及配置 添加.s文件 匯編程序: AREAMYDATA,DATA AREAMYCODE,CODE ENTRY EXPORT__main __main MOVR0,#10 M…

P2Rank網頁端:預測蛋白結合口袋+vina分子對接

P2Rank 是一種基于機器學習的蛋白質口袋預測工具,用于識別蛋白質結構中的潛在配體結合位點。它采用了一種基于物理特征的打分方法,結合隨機森林(Random Forest)機器學習模型,以提高口袋預測的精確度。 該程序有在線工具…

安裝windows server 2016沒有可選硬盤,設備安裝過ubuntu系統

如果在安裝 Windows Server 2016 時無法識別已安裝過 Ubuntu 的硬盤,可能是由于硬盤分區格式(如 ext4)與 Windows 不兼容,或缺少必要的驅動程序。以下是詳細的解決方案: 1. 檢查 BIOS/UEFI 設置 確認硬盤模式 ? 重啟電…