📅  最后修改于: 2023-12-03 15:22:57.395000             🧑  作者: Mango
本文介绍使用Python PyQt制作一个简单的界面,用于展示各国新冠病毒病例数,数据来自于 Worldometers。
首先,需要安装Python和PyQt库,可以使用以下命令进行安装:
pip install PyQt5
使用PyQt设计一个简单的界面,如下:
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
# 设置窗口标题和大小
self.setWindowTitle("各国新冠病毒病例")
self.setGeometry(100, 100, 600, 400)
# 创建一个布局
layout = QVBoxLayout()
# 添加一个标签用于显示当前日期
self.date_label = QLabel()
layout.addWidget(self.date_label)
# 添加一个表格用于显示各国病例数
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['国家', '确诊人数', '死亡人数'])
layout.addWidget(self.table)
# 设置布局
self.setLayout(layout)
使用requests
库从Worldometers网站获取最新的疫情数据,并将数据解析成一个列表,供后续的表格显示。
import requests
from bs4 import BeautifulSoup
# 获取数据
url = "https://www.worldometers.info/coronavirus/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# 解析数据
table = soup.find_all("table")[0]
rows = table.find_all("tr")[1:]
data = []
for row in rows:
cols = row.find_all("td")
if len(cols) > 3:
country = cols[2].text.strip()
total_cases = int(cols[3].text.replace(",", "").strip())
total_deaths = int(cols[5].text.replace(",", "").strip())
data.append([country, total_cases, total_deaths])
将获取到的数据展示到表格中。
class Window(QWidget):
def __init__(self):
super().__init__()
# 设置窗口标题和大小
self.setWindowTitle("各国新冠病毒病例")
self.setGeometry(100, 100, 600, 400)
# 创建一个布局
layout = QVBoxLayout()
# 添加一个标签用于显示当前日期
self.date_label = QLabel()
layout.addWidget(self.date_label)
# 添加一个表格用于显示各国病例数
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['国家', '确诊人数', '死亡人数'])
layout.addWidget(self.table)
# 设置布局
self.setLayout(layout)
# 更新表格数据
self.update_data()
def update_data(self):
# 获取数据
url = "https://www.worldometers.info/coronavirus/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# 解析数据
table = soup.find_all("table")[0]
rows = table.find_all("tr")[1:]
data = []
for row in rows:
cols = row.find_all("td")
if len(cols) > 3:
country = cols[2].text.strip()
total_cases = int(cols[3].text.replace(",", "").strip())
total_deaths = int(cols[5].text.replace(",", "").strip())
data.append([country, total_cases, total_deaths])
# 更新标签文本
self.date_label.setText("更新日期:" + datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 更新表格数据
self.table.setRowCount(len(data))
for i, row in enumerate(data):
for j, col in enumerate(row):
item = QTableWidgetItem(str(col))
item.setTextAlignment(Qt.AlignCenter)
self.table.setItem(i, j, item)
最后,我们添加以下代码并运行程序:
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
程序运行时将展示如下所示的界面:
完整代码如下:
import sys
import requests
from bs4 import BeautifulSoup
from datetime import datetime
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Window(QWidget):
def __init__(self):
super().__init__()
# 设置窗口标题和大小
self.setWindowTitle("各国新冠病毒病例")
self.setGeometry(100, 100, 600, 400)
# 创建一个布局
layout = QVBoxLayout()
# 添加一个标签用于显示当前日期
self.date_label = QLabel()
layout.addWidget(self.date_label)
# 添加一个表格用于显示各国病例数
self.table = QTableWidget()
self.table.setColumnCount(3)
self.table.setHorizontalHeaderLabels(['国家', '确诊人数', '死亡人数'])
layout.addWidget(self.table)
# 设置布局
self.setLayout(layout)
# 更新表格数据
self.update_data()
def update_data(self):
# 获取数据
url = "https://www.worldometers.info/coronavirus/"
response = requests.get(url)
soup = BeautifulSoup(response.text, "html.parser")
# 解析数据
table = soup.find_all("table")[0]
rows = table.find_all("tr")[1:]
data = []
for row in rows:
cols = row.find_all("td")
if len(cols) > 3:
country = cols[2].text.strip()
total_cases = int(cols[3].text.replace(",", "").strip())
total_deaths = int(cols[5].text.replace(",", "").strip())
data.append([country, total_cases, total_deaths])
# 更新标签文本
self.date_label.setText("更新日期:" + datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 更新表格数据
self.table.setRowCount(len(data))
for i, row in enumerate(data):
for j, col in enumerate(row):
item = QTableWidgetItem(str(col))
item.setTextAlignment(Qt.AlignCenter)
self.table.setItem(i, j, item)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
注:PNG格式的图片无法展示,因此将截图以JPG格式上传。