之前的分享中,我们制作了一个天眼查GUI程序和一个微博抓包GUI程序。今天我们将在此基础上继续开发新的功能,疫情信息快速查看工具,先来看看最终效果吧。整体的界面和框架还是继承了之前分享的工具,直接看相关功能吧。收集疫情数据的网站首先我们先收集一些显示疫情相关信息的网站,比如上图显示的百度实时疫情大数据报告,当然还有新浪、腾讯、丁香医生和美国华人网络等也可以自己收集相关网站可以添加到程序中。#疫情数据网站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/查看/肺炎',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"、"丁香园"、"华尔街"、"今日头条"、"美华网"]上面定义了疫情数据网站的地图,定义了一个下拉文本列表组合框组件。页面布局。我们先来定义一下疫情的Widget数据。defyiqingWidget(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()fori,dinenumerate(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,1,0,0,01)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()页面布局也比较简单,有标签用于显示文字,并有一个下拉框可以切换疫情网站,还有一个进度条组件可以显示网站的加载进度。当然,渲染网页的QWebEngineView组件也是必不可少的。对于切换疫情网站的下拉框,实现的逻辑是每次切换都会自动请求网站数据渲染到QWebEngineView组件,而这个逻辑是通过函数slot_init实现的。下面看一下slot_init的具体实现。引擎切换逻辑我们先看函数slot_initdefslot_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)该函数实现三个函数切换引擎自动渲染切换,下拉框不能选中,网站渲染进度显示在进度条中。让我们一一检查每个功能。切换引擎自动渲染这里使用了slot函数,将组件comboBox的index传递给函数change_engine,然后在该函数中重新加载网站URL,并设置comboBox不可用。@pyqtSlot(int)defchange_engine(self,index):"""改变引擎,触发:paramindex::return:"""try:self.yiqing_comboBox.setEnabled(False)self.yiqingWebEngine.load(QUrl(site_map[index]))exceptExceptionase:print("yiqingwebengineloaderror:",e)切换时无法选中下拉框。是否可以使用下拉框可以通过属性setEnabled来设置。网站渲染完成后,通过调用函数change_state来切换下拉框的状态。defchange_state(self):"""加载过程中,关闭comboBox:return:"""self.yiqing_comboBox.setEnabled(True)网站是否渲染通过属性loadFinished判断。在进度条中显示网站渲染进度的功能稍微复杂一点,需要用到多线程,我们在之前的微博抓取程序中也用到了。该程序的不同之处在于需要通过属性loadProgress获取网站的加载进度,其余代码与微博抓取文章的代码基本相同。@pyqtSlot(int)defloadProgressHandler(self,prog):#print(time.time(),":loadprogress",prog)self.yiqing_qth=YiQingQueryThread(prog)self.yiqing_qth.update_yiqing_data.connect(self.yiqingPgbUpdate)复制代码self.yiqing_qth.start()Epidemicsubprocesscode:"""Subprocessepidemicquery"""classYiQingQueryThread(QThread):#创建一个信号,并在触发时将当前时间传递给槽函数def__init__(self,p):super(YiQingQueryThread,self).__init__()self.p=pupdate_yiqing_data=pyqtSignal(int)defrun(self):self.update_yiqing_data.emit(self.p)因为需要传递属性loadProgress的值,所以初始化函数定义为Accept,通过slot参数update_yiqing_data传递。至此,我们的疫情数据查询功能就完成了~。
