Как сделать анимацию загрузки при условии на 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' ',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 = params= result = requests.get(url, params=params) weather = result.json() unitaz['text'] = f'Информация о городе: ' taburet['text'] = f'Температура: °' sardelka['text'] = f'Облачность: %.' sosiska['text'] = f'Скорость ветра: м/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()
- Вопрос задан 18 мар. 2023
- 324 просмотра
1 комментарий
Средний 1 комментарий
Как сделать анимацию загрузки edit_text aiogram?
надо создать код под айограм используя модуль time , неоходимо сделать анимацию загрузки в виде процентов от 0-100% примерный код который смог придумать приклеплен снизу , помогите решить эту проблему , вся основная задача заключается в edit_text тоесть бот должен редактировать сообщения каждый раз меняя его от 0% до 100% таким образом и выходит анимация , я сам попытался сделать через модуль time Код
import time pisos = 0 ids = "" for i in range(2,101): time.sleep(0.8) if pisos == 100: break else: pisos += 1 ids += str(message.message_id) await bot.message.edit_text(message.chat.id, message.message_id=ids, f'Перезагрузка бота : %')
Отслеживать
68k 218 218 золотых знаков 79 79 серебряных знаков 221 221 бронзовый знак
задан 7 сен 2021 в 3:46
Макс Соловьев Макс Соловьев
17 5 5 бронзовых знаков
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для шага в 10 (10, 20, 30, . 100):
@dp.callback_query_handler(text="animation") async def animation_handler(query: CallbackQuery): for i in range(110): await query.message.edit_text(text=f"%") await asyncio.sleep(0.2)
Для шага в 1 (1, 2, 3, . 100):
@dp.callback_query_handler(text="animation") async def animation_handler(query: CallbackQuery): for i in range(101): await query.message.edit_text(text=f"%") await asyncio.sleep(0.2)
Если хотите, чтобы бот реагировал на конкретный текст:
import asyncio from aiogram.dispatcher.filters import Text . @dp.message_handler(Text(equals="Загрузка", ignore_case=True)) async def animation_handler(message: Message): upload_message = await bot.send_message(chat_id=message.chat.id, text="Начинаем загрузку. ") await asyncio.sleep(1) for i in range(101): await upload_message.edit_text(text=f"%") await asyncio.sleep(0.2)
Обработка ввода и анимации¶
Взаимодействие пользователя с компьютером основано на событиях, любые действия производимые пользователем порождают события — движение мыши, нажатия клавиш, специальных кнопок. Внутри библиотеки PyGame есть инструменты для обратки событий, которые происходят внутри приложений.
Мы с вами уже знакомы с методом получения всех произошедших событий — pygame.event.get() , который возвращает события, произошедшие с последнего обращения.
Помимо событий выхода из приложения pygame.QUIT , есть множество других — например, нажатия клавиш pygame.KEYDOWN или отпускания pygame.KEYUP .
Рассмотрим взаимодействие с событиями на примере небольшой программы, в которой по нажатию клавиш показывается квадрат:
import sys import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) rect = pygame.Rect(40, 40, 120, 120) color = (0, 0, 0) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: color = (255, 255, 255) pygame.draw.rect(screen, color, rect, 0) pygame.display.flip()
В данном блоке программа занимется обработкой нажатия клавиш. Сначала мы получаем список всех событий, после чего начинаем последовательно проверять их. Если одно из событий соответствует сигналу к завершению программы, закрываем окно. Если же это нажатие клавиши — перекрашиваем прямоугольник в белый цвет.
При нажатии клавиш
При отпускании клавиш
При нажатии кнопки закрытия программы
При движении мыши
Обработка нажатий клавиш¶
Когда мы нажимаем клавишу, в систему передаётся не только информация о том, что какая-то кнопка нажата, но и её код.
- pygame.event.get()
- pygame.key.get_pressed()
С первым мы уже знакомы, поэтому стоит внимательнее рассмотреть второй. Он позволяет получить список клавиш, которые нажаты в данный момент в виде кортежа булевых значений. Чтобы узнать нажата ли интересующая нас кнопка, необходимо проверить значение, которе содержится в данном кортеже:
keys = pygame.key.get_pressed() if keys[pygame.K_RETURN]: print("Нажата клавиша enter")
Перемещение объектов¶
Умея получать от пользователя ввод, мы можем реализовать движения наших фигур на экране:
import sys import pygame pygame.init() screen = pygame.display.set_mode((640, 480)) rect = pygame.Rect(40, 40, 120, 120) while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: rect.move_ip(-40, 0) elif event.key == pygame.K_RIGHT: rect.move_ip(40, 0) elif event.key == pygame.K_UP: rect.move_ip(0, -40) elif event.key == pygame.K_DOWN: rect.move_ip(0, 40) pygame.draw.rect(screen, (255, 0, 0), rect, 0) pygame.display.flip()
Для движения объектов используются методы move() и move_ip() , которыми обладают объекты, созданные с помощью функций из pygame.draw . Первый создаёт новую фигуру такого же типа, находящуюся по заданному смещению, второй непосредственно изменяет положение имеющейся фигуры.
Запустив данный код, вы можете заметить, что при перемещении фигуры от неё остаётся “след”. Это связано с тем, что при перемещении объекта, мы его не перемещаем на экране, а рисуем на новом месте поверх старого кадра.
Чтобы избежать данной проблемы, надо добавить вызов метода fill() у нашего экрана, на котором мы рисуем и передать ему цвет, которым надо закрасить фон. Данное действие надо проводить каждый раз перед отрисовкой кадра:
# здесь могла быть ваша проверка событий screen.fill((0, 0, 0)) pygame.draw.rect(screen, (255, 0, 0), rect, 0) pygame.display.flip()
Использование спрайтов¶
Спрайт — двумерное изображение, используемое в играх.
pygame.image. load ( path ) ¶
Функция для загрузки спрайта из картинки. Path — путь до изображения, возвращает объект типа Surface, который можно использовать для рисования.
Для отрисовки спрайта на экране надо вызвать метод blit() у поверхности на которой производится отрисовка и передать объект спрайта вместе с координатами на которых необходимо отрисовать:
screen = pygame.display.set_mode((640, 480)) sprite = pygame.image.load("sprite.png") screen.blit(sprite, (20, 20)) pygame.quit()
Анимации¶
В pygame анимации создаются при помощи набора спрайтов, которые последовательно отрисовываются:
animation_set = [pygame.image.load(f"ri>.png") for i in range(1, 6)] window = pygame.display.set_mode((640, 480)) clock = pygame.time.Clock() i = 0 while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() window.fill((0,0,0)) window.blit(animation_set[i // 12], (100, 20)) i += 1 if i == 60: i = 0 pygame.display.flip() clock.tick(60)
Создаём список спрайтов, каждый из которых будет отдельным кадром анимации:
animation_set = [pygame.image.load(f"ri>.png") for i in range(1, 6)]
Создаём часы, для ограничения количества кадров в секунду:
clock = pygame.time.Clock()
Вспомогательная переменная, которая поможет выбирать нужную анимацию в зависимости от номера кадра:
i = 0
Выбор анимации в зависимости от номера кадра и его отрисовка:
window.blit(animation_set[i // 12], (100, 20))
Изменение переменной, помогающей выбрать нужный кадр:
i += 1 if i == 60: i = 0
Ограничение количества кадров в секунду, благодаря чему становится проще просчитывать анимации и синхронизировать события:
clock.tick(60)
Задания¶
- Написать программу, которая будет писать в консоль названия нажатых клавиш. Реализовать поддержку enter, space, w, a, s, d, esc.
- С помощью циклов, используя квадрат 10х10 пикселей и его след, нарисовать рамку 100х100 пикселей.
- Написать программу, в которой по нажатию клавиш будет двигаться квадрат размером 20х20 пикселей. Учесть, что квадрат не должен выходить за границы экрана.
- Доработать программу, чтобы квадрат при каждом движении менял свой цвет на случайный.
- Реализовать анимацию движения персонажа. При движении влево или вправо должны показываться соответствующие анимации. Кадры для них взять из архива animations.zip
© Copyright Revision d00c0df4 .
Built with Sphinx using a theme provided by Read the Docs.
Read the Docs v: latest
Versions latest Downloads html On Read the Docs Project Home Builds Free document hosting provided by Read the Docs.
Как сделать анимированную загрузку?

А тут и библиотека функциональнее и код готовый, удаляй лишнее и дописывай своё.
Но раз уж хочется так, то ответ тоже оставлю
Решения вопроса 1

Hemul GM @HemulGM Куратор тега Python
Delphi Developer, сис. админ
window.mainloop() должен быть в основном потоке. Т.е. не нужно его запускать в отдельном.
И указывать метод для target нужно без скобок, т.к. ты передаешь ссылку на метод dow, а если указываешь скобки, то метод сначала выполняется, а потом передается результат его выполнения. А т.к. у тебя там цикл бесконечный, то он бесконечно выполняется (вне потока)
from tkinter import * import time from threading import * DoLoading = False def dow(): global DoLoading while DoLoading: window.title("Загрузка.") time.sleep(1) window.title("Загрузка..") time.sleep(1) window.title("Загрузка. ") time.sleep(1) window.title("Загрузка. ") time.sleep(1) window.title("Готов") def loading(): global DoLoading DoLoading = True Thread(target = dow).start() def loading_stop(): global DoLoading DoLoading = False window = Tk() window.geometry('600x450') window.resizable(width=False, height=False) btn = Button(window, text="Готово", command=loading_stop) btn.grid(column=1, row=0) loading() window.mainloop()
Ответ написан более двух лет назад
Igor_Merg @Igor_Merg Автор вопроса
Можете скинуть ссылку там, где будут расписаны все функции? Просто я искал там в основном уроки и не удобно

Hemul GM @HemulGM Куратор тега Python
Igor_Merg, функции чего?

Hemul GM @HemulGM Куратор тега Python
Igor_Merg, обновил код в ответе, чтоб показать, как лучше сделать отображение загрузки в заголовке окна
Ответы на вопрос 1
from tkinter import * import time from threading import * class My_window(Tk): def __init__(self): super(My_window,self).__init__() self._state = None self._thread = Thread(target=self.loop_poop) self._thread.setDaemon(True) self._thread_active = False def loop_poop(self): while self._thread_active: if self._state: time.sleep(1) self.title (time.ctime()) else: pass @property def is_downloading(self): return self._state @is_downloading.setter def is_downloading(self,tpm): print('Start threding', tpm) if tpm == True: if self._thread_active == True: self._state=True else: self._state=True self._thread_active=True self._thread.start() elif tpm == False: self._state = False else: return(False) def on(window): window.is_downloading = True def off(window): window.is_downloading = False window = My_window() on_btn = Button(window,text='on', height=1, width=20, command=lambda window = window:on(window)).pack() off_btn = Button(window,text='off', height=1, width=20, command=lambda window = window:off(window)).pack() window.geometry('400x50') window.resizable(width=False, height=False) window.mainloop()
Ответ написан более двух лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- Python
Опять коги! Выдаёт ошибку, как её убрать?
- 1 подписчик
- 47 минут назад
- 34 просмотра

- Python
- +1 ещё
Как заставить селениум просто открыть страницу и ждать?
- 1 подписчик
- 2 часа назад
- 215 просмотров