Помогите вставить в код .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()


