@BulkaMix

Как сделать анимацию загрузки при условии на python tkinter?

Хочу,чтобы при нажатии кнопки "Посмотреть погоду" начиналась анимация загрузки с выводом на экран. После вывода нужной информации о погоде - анимация заканчивалась. Как это сделать?

Вот код -
from tkinter import *
from tkinter import ttk


import requests
from bs4 import BeautifulSoup
from datetime import datetime

#Создание окна
window = Tk()
w = 600
h = 600
window.geometry('600x600')


window.geometry(f"+{(window.winfo_screenwidth() - 650) // 2}+{(window.winfo_screenheight() - 650) // 2}")



canvas = Canvas(window,width=w, height=h)

today = datetime.today().strftime('%d.%m.%Y')
data = Label(window, text=f' {today}',bg='#fda0a7',fg='white',font='GeosansLight 12')
data.place(x=505,y=565)

	

#Поле ввода
edit = Entry(window,bg='white',width=30)
edit.pack()



canvas.pack()




# window.resizable(0, 0)

window.title('Прогноз погоды MixWeather')



#Погода на сегодня текст


canvas.create_text(190,70,anchor=W,font='Code-Pro-Light-LC 26',fill='white',text='Погода на сегодня')

def get_weather():
    
    city = edit.get()

    
    key = ''
    url = 'http://api.openweathermap.org/data/2.5/weather'
    # params = {'APPID': key, 'q': city, 'units':  'metric'}
    params={'q': city, 'type': 'like', 'units': 'metric', 'APPID': key}

    result = requests.get(url, params=params)
    weather = result.json()
    
    unitaz['text'] = f'Информация о городе: {str(weather["name"])}'
    taburet['text'] = f'Температура: {weather["main"]["temp"]}°'
    sardelka['text'] = f'Облачность: {weather["clouds"]["all"]}%.'
    sosiska['text'] = f'Скорость ветра: {weather["wind"]["speed"]}м/c'





            
btn = ttk.Button(window, text='Посмотреть погоду', command=get_weather)
    
    


def clear():
    edit.delete(0, END)   # удаление введенного текста

def display():
    label["text"] = edit.get()   # получение введенного текста

# вставка начальных данных
edit.insert(0, "Введите название своего города")

clear_button = ttk.Button(text="Очистить", command=clear)
clear_button.pack(side=LEFT, anchor=N, padx=6, pady=6)
clear_button.place(x=390,y=0,height=21)





unitaz = Label(window, text='Информация о городе:',bg='#fa92bc',fg='#262626', font='Code-Pro-Bold')
taburet = Label(window, text='Температура:',bg='#f98ec1',fg='#454545', font='Code-Pro-Bold')
sardelka = Label(window, text='Облачность:',bg='#f788c3',fg='#454545', font='Code-Pro-Bold')
sosiska = Label(window, text='Скорость ветра:',bg='#f989c0',fg='#454545', font='Code-Pro-Bold')
unitaz.place(x=30,y=470)
taburet.place(x=30,y=500)
sardelka.place(x=30,y = 530)
sosiska.place(x=30,y=560)


canvas.pack()

entry = ttk.Entry()
entry.pack(anchor=NW, padx=6, pady=6)

btn.pack()
btn.place(x=240,y=19)

label = ttk.Label()
label.pack(anchor=NW)







window.mainloop()
  • Вопрос задан
  • 513 просмотров
Пригласить эксперта
Ответы на вопрос 1
Vindicar
@Vindicar
RTFM!
1. Подумать.
2. Сделать.

А если серьёзно, вынеси загрузку в отдельный поток, в идеале - обёрнутый в класс. Поток НЕ ДОЛЖЕН обращаться напрямую к элементам интерфейса - только к полям своего класса.
По нажатию кнопки запускай этот поток. Только запуск, без ожидания.

Чтобы обнаружить завершение, после запуска потока сделай цикл с помощью window.after(). Подробности в доках, но если кратко, метод after() позволяет вызвать функцию в потоке GUI спустя некоторое время. При этом функция может снова запланировать свой вызов через after(), тем самым создавая как-бы цикл. Если не запланируешь новый вызов - цикл прервётся.
Соответственно, идея в том, что эта функция будет проверять, не закончил ли поток работу (например, читать какое-нибудь логическое значение). Если закончил - она будет вправе обратиться к элементам GUI, чтобы вывести результат. Если не закончил - она снова запланирует свой вызов через after(), скажем, через 200 миллисекунд.

Ну и да - исключения, чёрт побери! Обрабатывай исключения!
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы