In this article, we are going to discuss how to create a weather app using tkinter. The GUI app will tell us the current weather of a particular city along with temperature details along with other details.
Modules required:
- Tkinter: It is a built-in python library for making GUI using tkinter toolkit.
- Requests: It is a library which helps in fetching the data with the help of URL. It can be installed using the below command:
pip install requests
Approach:
Firstly, we have to use a weather API for fetching the data from the Open Weather Map website by generating an API key, and then we need to create a configuration file to store the key. And finally using that configuration file in the python script.
Steps to generate an API key:
- Login in the Open Weather Map
- Go to the API section. Then in the Current Weather Data section click on the Api doc.
- Now in the API Call section, we have the link of api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key}
- Click on the API key on the link it will direct to the page from where you can get the key. The generated key looks like this:
Steps to create the Configuration file:
- Create a file named config.ini.
- Write key name enclosed in closed brackets in it here [gfg].
- Create a variable key(here key) and paste the key you copied as shown below:
Steps to create the Python script:
- Import modules.
Python3
# import required modules from configparser import ConfigParser
import requests
from tkinter import *
from tkinter import messagebox
|
- We have to first make the body of the GUI with the help of tkinter.
Python3
# create object app = Tk()
# add title app.title( "Weather App" )
# adjust window size app.geometry( "300x300" )
# add labels, buttons and text city_text = StringVar()
city_entry = Entry(app, textvariable = city_text)
city_entry.pack() Search_btn = Button(app, text = "Search Weather" ,
width = 12 , command = search)
Search_btn.pack() location_lbl = Label(app, text = "Location" ,
font = { 'bold' , 20 })
location_lbl.pack() temperature_label = Label(app, text = "")
temperature_label.pack() weather_l = Label(app, text = "")
weather_l.pack() app.mainloop() |
- Read the config.ini file and then load the key and URL in the program.
Python3
# extract key from the # configuration file config_file = "config.ini"
config = ConfigParser()
config.read(config_file) api_key = config[ 'gfg' ][ 'api' ]
|
- Make a getweather() function to get the weather of a particular location.
Python3
# explicit function to get # weather details def getweather(city):
result = requests.get(url. format (city, api_key))
if result:
json = result.json()
city = json[ 'name' ]
country = json[ 'sys' ]
temp_kelvin = json[ 'main' ][ 'temp' ]
temp_celsius = temp_kelvin - 273.15
weather1 = json[ 'weather' ][ 0 ][ 'main' ]
final = [city, country, temp_kelvin,
temp_celsius, weather1]
return final
else :
print ( "NO Content Found" )
|
- Search function so that we can get the output weather details.
Python3
# explicit function to # search city def search():
city = city_text.get()
weather = getweather(city)
if weather:
location_lbl[ 'text' ] = '{} ,{}' . format (weather[ 0 ], weather[ 1 ])
temperature_label[ 'text' ] = str (weather[ 3 ]) + " Degree Celsius"
weather_l[ 'text' ] = weather[ 4 ]
else :
messagebox.showerror( 'Error' , "Cannot find {}" . format (city))
|
Below is the complete program:
Python3
# import required modules from configparser import ConfigParser
import requests
from tkinter import *
from tkinter import messagebox
# extract key from the # configuration file config_file = "config.ini"
config = ConfigParser()
config.read(config_file) api_key = config[ 'gfg' ][ 'api' ]
# explicit function to get # weather details def getweather(city):
result = requests.get(url. format (city, api_key))
if result:
json = result.json()
city = json[ 'name' ]
country = json[ 'sys' ]
temp_kelvin = json[ 'main' ][ 'temp' ]
temp_celsius = temp_kelvin - 273.15
weather1 = json[ 'weather' ][ 0 ][ 'main' ]
final = [city, country, temp_kelvin,
temp_celsius, weather1]
return final
else :
print ( "NO Content Found" )
# explicit function to # search city def search():
city = city_text.get()
weather = getweather(city)
if weather:
location_lbl[ 'text' ] = '{} ,{}' . format (weather[ 0 ], weather[ 1 ])
temperature_label[ 'text' ] = str (weather[ 3 ]) + " Degree Celsius"
weather_l[ 'text' ] = weather[ 4 ]
else :
messagebox.showerror( 'Error' , "Cannot find {}" . format (city))
# Driver Code # create object app = Tk()
# add title app.title( "Weather App" )
# adjust window size app.geometry( "300x300" )
# add labels, buttons and text city_text = StringVar()
city_entry = Entry(app, textvariable = city_text)
city_entry.pack() Search_btn = Button(app, text = "Search Weather" ,
width = 12 , command = search)
Search_btn.pack() location_lbl = Label(app, text = "Location" , font = { 'bold' , 20 })
location_lbl.pack() temperature_label = Label(app, text = "")
temperature_label.pack() weather_l = Label(app, text = "")
weather_l.pack() app.mainloop() |
Output: