Помогите вставить в код .jpg если в json дан такой ответ

Например: если json дает ответ "Clear", то ставится одна картинка, если "Rain", то другая и так далее.

Все эти картинки должны выводиться во втором фрейме после текста про погоду (как на скрине). Возможно ли это сделать?

from tkinter import *
from PIL import Image, ImageTk
# URL запросы
import requests

# окно приложения
root = Tk()

# Эта функция срабатывает при нажатии на кнопку "Посмотреть погоду"
def get_weather():
    
    # Получаем данные от пользователя
    city = cityField.get()
 
    
    # openweathermap.org
    key = 'api key'
    # ссылка, с которой мы получим все данные в формате JSON
    url = 'http://api.openweathermap.org/data/2.5/weather'
    # Дополнительные парамтеры (Ключ, город введенный пользователем и единицины измерения - metric = Цельсий)
    params = {'APPID': key, 'q': city, 'units': 'metric'}
    # Отправляем запрос по определенному URL
    result = requests.get(url, params=params)
    # Получаем JSON ответ по этому URL
    data = result.json()

    city = data["name"]
    cur_weather = data["main"]["temp"]
    png = data ["weather"][0]["main"]

    code_to_png = {
        "Clear": "",
        "Clouds": "",
        "Rain": "",
        "Drizzle": "",
        "Thunderstorm": "",
        "Snow": "",
        "Mist": "",
        "Smoke": ""
    }

    if png in code_to_png:
        wd = code_to_png[png]
        
    # надпись для отображения пользователю

    info['text'] = (f"Погода в городе: {city}\nТемпература: {cur_weather}°C\n{wd}") 
    

# Настройки главного окна

# Указываем фоновый цвет
root['bg'] = '#3F72AF'
# Указываем название окна
root.title('Погода')
# Указываем размеры окна
root.geometry('400x300')
# Делаем невозможным менять размеры окна
root.resizable(width=False, height=False)

# Создаем фрейм (область для размещения других объектов)
# Указываем к какому окну он принадлежит, какой у него фон и какая обводка
frame_top = Frame(root, bg='#DBE2EF', bd=5)
# Также указываем его расположение
frame_top.place(relx=0.15, rely=0.15, relwidth=0.7, relheight=0.20)

# Все то-же самое, но для второго фрейма
frame_bottom = Frame(root, bg='#DBE2EF', bd=5)
frame_bottom.place(relx=0.15, rely=0.65, relwidth=0.7, relheight=0.25,)

# Создаем текстовое поле для получения данных от пользователя
cityField = Entry(frame_top, bg='white', font=35)
cityField.pack() # Размещение этого объекта, всегда нужно прописывать

# Создаем кнопку и при нажатии будет срабатывать метод "get_weather"
btn = Button(frame_top, text='Посмотреть погоду', command=get_weather)
btn.place ()
btn.pack()

# Создаем текстовую надпись, в которую будет выводиться информация о погоде
info = Label(frame_bottom, text='Погодная информация', bg='#DBE2EF', font=40)
info.pack()

# Запускаем постоянный цикл, чтобы программа работала
root.mainloop()




Ответы (1 шт):

Автор решения: S. Nick

Попробуйте так:

from tkinter import *
from PIL import Image, ImageTk
import requests

# окно приложения
root = Tk()

# Эта функция срабатывает при нажатии на кнопку "Посмотреть погоду"
def get_weather():
    # Получаем данные от пользователя
    city = cityField.get()
    
    # openweathermap.org
    key = '12345.....12345'                 # !!! установите свой key
    # ссылка, с которой мы получим все данные в формате JSON
    url = 'http://api.openweathermap.org/data/2.5/weather'
    # Дополнительные парамтеры (Ключ, город введенный пользователем и единицины измерения - metric = Цельсий)
    params = {'APPID': key, 'q': city, 'units': 'metric'}
    # Отправляем запрос по определенному URL
    result = requests.get(url, params=params)
    # Получаем JSON ответ по этому URL
    data = result.json()

    city = data["name"]
    cur_weather = data["main"]["temp"]
    png = data ["weather"][0]["main"]

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv    
    #print(f'data = {data["weather"][0]["main"]}') 
    main_weather = data["weather"][0]["main"]
    if main_weather == "Clear":
        img = ImageTk.PhotoImage(Image.open("XZ.jpg"))    
        imgLabel.configure(image=img)
        imgLabel.image = img 
        
        ''' и так далее
    elif main_weather == "???":
        ...
    ...
        '''
    else:
        img = ImageTk.PhotoImage(Image.open("_+_.png"))    
        imgLabel.configure(image=img)
        imgLabel.image = img      
        
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    code_to_png = {
        "Clear": "",
        "Clouds": "",
        "Rain": "",
        "Drizzle": "",
        "Thunderstorm": "",
        "Snow": "",
        "Mist": "",
        "Smoke": ""
    }

    if png in code_to_png:
        wd = code_to_png[png]
        
    # надпись для отображения пользователю

    info['text'] = (f"Погода в городе: {city}\nТемпература: {cur_weather}°C\n{wd}") 
    

# Настройки главного окна

# Указываем фоновый цвет
root['bg'] = '#3F72AF'
# Указываем название окна
root.title('Погода')
# Указываем размеры окна
root.geometry('520x300')                                             # +
# Делаем невозможным менять размеры окна
root.resizable(width=False, height=False)

# Создаем фрейм (область для размещения других объектов)
# Указываем к какому окну он принадлежит, какой у него фон и какая обводка
frame_top = Frame(root, bg='#DBE2EF', bd=5)
# Также указываем его расположение
frame_top.place(relx=0.15, rely=0.15, relwidth=0.7, relheight=0.20)

# Все то-же самое, но для второго фрейма
frame_bottom = Frame(root, bg='#DBE2EF', bd=5)
frame_bottom.place(relx=0.15, rely=0.65, relwidth=0.7, relheight=0.25,)


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv    
imgLabel = Label(root)    
imgLabel.place(x=410, y=195, width=73, height=74)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


# Создаем текстовое поле для получения данных от пользователя
cityField = Entry(frame_top, bg='white', font=35)
cityField.pack() # Размещение этого объекта, всегда нужно прописывать

# Создаем кнопку и при нажатии будет срабатывать метод "get_weather"
btn = Button(frame_top, text='Посмотреть погоду', command=get_weather)
btn.place ()
btn.pack()

# Создаем текстовую надпись, в которую будет выводиться информация о погоде
info = Label(frame_bottom, text='Погодная информация', bg='#DBE2EF', font=40)
info.pack()

# Запускаем постоянный цикл, чтобы программа работала
root.mainloop()

введите сюда описание изображения


Update

я сделал также,но при добавлении 2ого

elif main_weather == ".......": 
    img = ImageTk.PhotoImage(Image.open("sunny.jpg")) 
    imgLabel.configure(image=img) 
    imgLabel.image = img

ТО он выдает ошибку и не понимает что такое imgLabel


Нет никаких ошибок.

from tkinter import *
from PIL import Image, ImageTk
import requests

# окно приложения
root = Tk()

# Эта функция срабатывает при нажатии на кнопку "Посмотреть погоду"
def get_weather():
    # Получаем данные от пользователя
    city = cityField.get()
    
    # openweathermap.org
    key = '12345...12345'                 # !!! установите свой key
    # ссылка, с которой мы получим все данные в формате JSON
    url = 'http://api.openweathermap.org/data/2.5/weather'
    # Дополнительные парамтеры (Ключ, город введенный пользователем и единицины измерения - metric = Цельсий)
    params = {'APPID': key, 'q': city, 'units': 'metric'}
    # Отправляем запрос по определенному URL
    result = requests.get(url, params=params)
    # Получаем JSON ответ по этому URL
    data = result.json()

    city = data["name"]
    cur_weather = data["main"]["temp"]
    png = data ["weather"][0]["main"]

# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv    
    print(f'data = {data["weather"][0]["main"]}') 
    main_weather = data["weather"][0]["main"]
    if main_weather == "Clear":
        img = ImageTk.PhotoImage(Image.open("XZ.jpg"))    
        imgLabel.configure(image=img)
        imgLabel.image = img 
    elif main_weather == "Clouds": 
        img = ImageTk.PhotoImage(Image.open("lena.jpg")) 
        imgLabel.configure(image=img) 
        imgLabel.image = img

        
        ''' и так далее
    elif main_weather == "???":
        ...
    ...
        '''
    else:
        img = ImageTk.PhotoImage(Image.open("_+_.png"))    
        imgLabel.configure(image=img)
        imgLabel.image = img      
        
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

    code_to_png = {
        "Clear": "",
        "Clouds": "",
        "Rain": "",
        "Drizzle": "",
        "Thunderstorm": "",
        "Snow": "",
        "Mist": "",
        "Smoke": ""
    }

    if png in code_to_png:
        wd = code_to_png[png]
        
    # надпись для отображения пользователю

    info['text'] = (f"Погода в городе: {city}\nТемпература: {cur_weather}°C\n{wd}") 
    

# Настройки главного окна

# Указываем фоновый цвет
root['bg'] = '#3F72AF'
# Указываем название окна
root.title('Погода')
# Указываем размеры окна
root.geometry('520x300')                                             # +
# Делаем невозможным менять размеры окна
root.resizable(width=False, height=False)

# Создаем фрейм (область для размещения других объектов)
# Указываем к какому окну он принадлежит, какой у него фон и какая обводка
frame_top = Frame(root, bg='#DBE2EF', bd=5)
# Также указываем его расположение
frame_top.place(relx=0.15, rely=0.15, relwidth=0.7, relheight=0.20)

# Все то-же самое, но для второго фрейма
frame_bottom = Frame(root, bg='#DBE2EF', bd=5)
frame_bottom.place(relx=0.15, rely=0.65, relwidth=0.7, relheight=0.25,)


# +++ vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv    
imgLabel = Label(root)    
imgLabel.place(x=410, y=195, width=73, height=74)
# +++ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^


# Создаем текстовое поле для получения данных от пользователя
cityField = Entry(frame_top, bg='white', font=35)
cityField.pack() # Размещение этого объекта, всегда нужно прописывать

# Создаем кнопку и при нажатии будет срабатывать метод "get_weather"
btn = Button(frame_top, text='Посмотреть погоду', command=get_weather)
btn.place ()
btn.pack()

# Создаем текстовую надпись, в которую будет выводиться информация о погоде
info = Label(frame_bottom, text='Погодная информация', bg='#DBE2EF', font=40)
info.pack()

# Запускаем постоянный цикл, чтобы программа работала
root.mainloop()

введите сюда описание изображения

→ Ссылка