📜  各国新冠病毒病例——使用Python PyQt(1)

📅  最后修改于: 2023-12-03 15:22:57.395000             🧑  作者: Mango

各国新冠病毒病例——使用Python PyQt

本文介绍使用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_())

程序运行时将展示如下所示的界面:

Screenshot

完整代码

完整代码如下:

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格式上传。