前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python 制作疫情信息查看工具

Python 制作疫情信息查看工具

作者头像
周萝卜
发布2022-12-27 15:18:19
发布2022-12-27 15:18:19
65800
代码可运行
举报
文章被收录于专栏:萝卜大杂烩萝卜大杂烩
运行总次数:0
代码可运行

在前面的分享中,我们制作了一个天眼查 GUI 程序,一个微博抓取 GUI 程序,今天我们在这个的基础上,继续开发新的功能,疫情信息快速查看工具,先来看下最终的效果

整体的界面和框架还是继承自前面分享的工具,我们直接来看相关功能

搜集疫情数据网站

首先我们先搜集一些展示疫情相关信息的网站,比如上图所示的百度疫情实时大数据报告,当然还有新浪,腾讯,丁香医生以及美国中文网等等,大家也可以自行搜集相关网站,添加到程序当中即可

代码语言:javascript
代码运行次数:0
运行
复制
# 疫情数据网站
site_map = {0: 'https://voice.baidu.com/act/newpneumonia/newpneumonia', 1: 'https://news.sina.cn/zt_d/yiqing0121',
            2: 'https://wp.m.163.com/163/page/news/virus_report/index.html',
            3: 'https://news.qq.com/zt2020/page/feiyan.htm#/', 4: 'https://sa.sogou.com/new-weball/page/sgs/epidemic',
            5: 'https://news.ifeng.com/c/special/7tPlDSzDgVk', 6: 'http://www.tcrj.com.cn/yqzt/index.chtml',
            7: 'http://shouji.360.cn/fyyqgjx/index.html', 8: 'https://ncov.dxy.cn/ncovh5/view/pneumonia',
            9: 'https://vip.jianshiapp.com/p/covid19-overseas',
            10: 'https://i.snssdk.com/ugc/hotboard_fe/hot_list/template/hot_list/forum_tab.html',
            11: 'http://m.sinovision.net/newpneumonia.php'}

comboBox_text = [
"百度",
"新浪",
"网易",
"腾讯",
"搜狗",
"凤凰",
"猕尔",
"360",
"丁香园",
"华尔街",
 "今日头条",
 "美国中文网"]

上面定义了疫情数据网站的 map,同时定义了一个 combobox 组件的下拉文字列表

页面布局

我们先定义疫情的 Widget 数据

代码语言:javascript
代码运行次数:0
运行
复制
def yiqingWidget(self):
    self.left_button_widget_4 = QtWidgets.QWidget()
    self.yiqingWebEngine = QWebEngineView()
    self.gridLayout_yiqing = QtWidgets.QGridLayout(self.left_button_widget_4)
    self.gridLayout_yiqing.setContentsMargins(0, 0, 0, 0)
    self.gridLayout_yiqing.setObjectName("gridLayout_yiqing")

    self.label_yiqing = QtWidgets.QLabel()
    self.label_yiqing.setObjectName("label_weibo")
    self.label_yiqing.setText("选择数据源")
    self.gridLayout_yiqing.addWidget(self.label_yiqing, 0, 1, 1, 1)
    self.yiqing_comboBox = QtWidgets.QComboBox()
    for i, d in enumerate(comboBox_text):
        self.yiqing_comboBox.addItem("")
        self.yiqing_comboBox.setItemText(i, str(d))
    self.yiqing_comboBox.setObjectName("yiqing_comboBox")
    self.gridLayout_yiqing.addWidget(self.yiqing_comboBox, 0, 2, 1, 1)

    self.gridLayout_yiqing.addWidget(self.yiqingWebEngine, 4, 0, 1, 9)
    self.right_layout.addWidget(self.left_button_widget_4, 0, 0, 1, 9)

    # 进度条
    self.label_yiqing_pgb = QtWidgets.QLabel()
    self.label_yiqing_pgb.setObjectName("label_yiqing_pgb")
    self.label_yiqing_pgb.setText("页面加载进度")

    self.gridLayout_yiqing.addWidget(self.label_yiqing_pgb, 0, 3, 1, 1)
    self.yiqing_pgb = QtWidgets.QProgressBar()
    self.yiqing_pgb.setFixedHeight(10)  # 设置进度条高度
    self.yiqing_pgb.setMinimum(0)
    self.yiqing_pgb.setMaximum(100)
    self.yiqing_pgb.setValue(self.pv)

    self.gridLayout_yiqing.addWidget(self.yiqing_pgb, 0, 4, 1, 1)

    self.yiqingWebEngine.load(QUrl(site_map[0]))

    self.slot_init()

页面布局也比较简单,有展示文字的 label,还有切换疫情网址的下拉框,以及展示网站加载进度的进度条组件,当然也少不了渲染网页的 QWebEngineView 组件。

对于下拉框切换疫情网站,实现的逻辑是每次切换,都会自动请求该网站数据,并渲染到 QWebEngineView 组件中,而这个逻辑都通过函数 slot_init 来实现。

下面我们看看 slot_init 的具体实现

引擎切换逻辑

我们先来看看函数 slot_init 的代码

代码语言:javascript
代码运行次数:0
运行
复制
def slot_init(self):
    self.yiqing_comboBox.currentIndexChanged[int].connect(self.change_engine)
    self.yiqingWebEngine.loadFinished.connect(self.change_state)
    self.yiqingWebEngine.loadProgress[int].connect(self.loadProgressHandler)

该函数实现了三个功能

  • 切换引擎自动渲染
  • 切换当中,下拉框不可被选中
  • 在进度条中展示网站渲染进度

下面我们逐一查看各个功能

切换引擎自动渲染

这里用到了槽函数,将组件 comboBox 的索引传递给函数 change_engine,然后在该函数中重新 load 网站 URL,并且设置 comboBox 不可用

代码语言:javascript
代码运行次数:0
运行
复制
@pyqtSlot(int)
def change_engine(self, index):
    """
    改变引擎,触发
    :param index:
    :return:
    """
    try:
        self.yiqing_comboBox.setEnabled(False)
        self.yiqingWebEngine.load(QUrl(site_map[index]))
    except Exception as e:
        print("yiqing web engine load error: ", e)

切换当中,下拉框不可被选中

下拉框是否可以使用,可以通过属性 setEnabled 进行设置,当网站渲染完毕后,通过调用函数 change_state 来切换下拉框状态

代码语言:javascript
代码运行次数:0
运行
复制
def change_state(self):
    """
    加载过程中,禁用comboBox
    :return:
    """
    self.yiqing_comboBox.setEnabled(True)

而网站是否渲染完毕,是通过属性 loadFinished 来判断的

在进度条中展示网站渲染进度

这个功能稍微复杂一些,需要用到多线程,我们在前面微博抓取程序中也使用到了

本程序的差异就在于需要通过属性 loadProgress 来获取网站加载进度,其余部分基本与微博抓取文章代码相同。

代码语言:javascript
代码运行次数:0
运行
复制
@pyqtSlot(int)
def loadProgressHandler(self, prog):
    # print(time.time(), ":load progress", prog)
    self.yiqing_qth = YiQingQueryThread(prog)
    self.yiqing_qth.update_yiqing_data.connect(self.yiqingPgbUpdate)
    self.yiqing_qth.start()

疫情子进程代码

代码语言:javascript
代码运行次数:0
运行
复制
"""子进程疫情查询"""
class YiQingQueryThread(QThread):
    # 创建一个信号,触发时传递当前时间给槽函数
    def __init__(self, p):
        super(YiQingQueryThread, self).__init__()
        self.p = p

    update_yiqing_data = pyqtSignal(int)
    def run(self):
        self.update_yiqing_data.emit(self.p)

因为需要传递属性 loadProgress 的数值,所以定义了初始化函数来接受,并通过槽参数 update_yiqing_data 来进行传递

至此,我们这个疫情数据查询功能就完成了~

结果展示

下面我们来看看最终的效果吧

持续关注,我们后面再继续集成开发其他功能哦!

http://mpvideo.qpic.cn/0bc3nyaaeaaa2eah56uvwbrva3wdajxaaaqa.f10002.mp4?dis_k=e265a950646e0c25e4ccc11187848462&dis_t=1672125447&play_scene=10400&vid=wxv_2703630108229713924&format_id=10002&support_redirect=0&mmversion=false

好了,这就是今天分享的全部内容,喜欢就点个吧~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萝卜大杂烩 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 搜集疫情数据网站
  • 页面布局
  • 引擎切换逻辑
    • 切换引擎自动渲染
    • 切换当中,下拉框不可被选中
    • 在进度条中展示网站渲染进度
  • 结果展示
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档