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: