In this article we will see how we can create a PyQt5 application that tells about the details of coronavirus cases i.e total cases, recovered cases and total deaths only by typing the name of the country.
Modules required and Installation:
PyQt5 : PyQt is a Python binding of the cross-platform GUI toolkit Qt, implemented as a Python plug-in. PyQt is free software developed by the British firm Riverbank Computing.
Requests : Requests allows you to send HTTP/1.1 requests extremely easily. There’s no need to manually add query strings to your URLs.
Beautiful Soup: Beautiful Soup is a library that makes it easy to scrape information from web pages. It sits atop an HTML or XML parser, providing Pythonic idioms for iterating, searching, and modifying the parse tree.
Implementations steps :
1. Create a non-editable combo box, set its geometry
2. Create country list which contain countries name and add it to the combo box
3. Create three labels to show information about total cases, recovered cases and death cases
4. Set geometry, alignment and border to each label
5. Add action to the combo box
6. Inside the action get the country name and scrap the data from the website with the help of requests BeautifulSoup
7. Convert the raw data into html code and then filter it to get the required output
8. Show the output the screen with the help of labels
Below is the implementation
# importing libraries from PyQt5.QtWidgets import * from PyQt5 import QtCore, QtGui from PyQt5.QtGui import * from PyQt5.QtCore import * from bs4 import BeautifulSoup as BS import requests import sys class Window(QMainWindow): def __init__( self ): super ().__init__() # setting title self .setWindowTitle( "Python " ) # setting geometry self .setGeometry( 100 , 100 , 400 , 500 ) # calling method self .UiComponents() # showing all the widgets self .show() # method for widgets def UiComponents( self ): # countries list // user can add other countries as well self .country = [ "india" , "us" , "spain" , "china" , "russia" , "pakistan" , "nepal" , "italy" , "spain" , "uk" , "brazil" ] # creating a combo box widget self .combo_box = QComboBox( self ) # setting geometry to combo box self .combo_box.setGeometry( 100 , 50 , 200 , 40 ) # setting font self .combo_box.setFont(QFont( 'Times' , 10 )) # adding items to combo box for i in self .country: i = i.upper() self .combo_box.addItem(i) # adding action to the combo box self .combo_box.activated.connect( self .get_cases) # creating label to show the total cases self .label_total = QLabel( "Total Cases " , self ) # setting geometry self .label_total.setGeometry( 100 , 300 , 200 , 40 ) # setting alignment to the text self .label_total.setAlignment(Qt.AlignCenter) # adding border to the label self .label_total.setStyleSheet( "border : 2px solid black;" ) # creating label to show the recovered cases self .label_reco = QLabel( "Recovered Cases " , self ) # setting geometry self .label_reco.setGeometry( 100 , 350 , 200 , 40 ) # setting alignment to the text self .label_reco.setAlignment(Qt.AlignCenter) # adding border self .label_reco.setStyleSheet( "border : 2px solid black;" ) # creating label to show death cases self .label_death = QLabel( "Total Deaths " , self ) # setting geometry self .label_death.setGeometry( 100 , 400 , 200 , 40 ) # setting alignment to the text self .label_death.setAlignment(Qt.AlignCenter) # adding border to the label self .label_death.setStyleSheet( "border : 2px solid black;" ) # method called by push def get_cases( self ): # getting country name index = self .combo_box.currentIndex() country_name = self .country[index] # creating url using country name # getting the request from url data = requests.get(url) # converting the text soup = BS(data.text, 'html.parser' ) # finding meta info for cases cases = soup.find_all( "div" , class_ = "maincounter-number" ) # getting total cases number total = cases[ 0 ].text # filtering it total = total[ 1 : len (total) - 2 ] # getting recovered cases number recovered = cases[ 2 ].text # filtering it recovered = recovered[ 1 : len (recovered) - 1 ] # getting death cases number deaths = cases[ 1 ].text # filtering it deaths = deaths[ 1 : len (deaths) - 1 ] # show data through labels self .label_total.setText( "Total Cases : " + total) self .label_reco.setText( "Recovered Cases : " + recovered) self .label_death.setText( "Total Deaths : " + deaths) # create pyqt5 app App = QApplication(sys.argv) # create the instance of our Window window = Window() window.show() # start the app sys.exit(App. exec ()) |
Output :