Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/47: Рейтинг темы: голосов - 47, средняя оценка - 4.81
21 / 21 / 8
Регистрация: 07.01.2009
Сообщений: 556

Сформировать задержку при рисовании в цикле

02.05.2019, 14:32. Показов 9674. Ответов 5

Студворк — интернет-сервис помощи студентам
Пытаюсь вставить задержку в цикл, чтобы на каждой итерации была пауза 1 секунду.
Не работает. Сначала отрабатывает пауза в цикле, после этого мгновенно без задержек рисуются линии.
Сделал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import tkinter
import random
import time
window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=1200, height=900, bg="white")
canvas.pack()
y = random.randint(1, 900)
for i in range(1, 100):
    x = random.randint(1, 1200)
    canvas.create_line(0,y, x, 0, fill = "black", width = 3)
    y = random.randint(1, 900)
    canvas.create_line(x, 0, 1200, y, fill = "black", width = 3)
    x = random.randint(1, 1200)
    canvas.create_line(1200, y, x, 900, fill = "black", width = 3)
    y = random.randint(1, 900)
    canvas.create_line(x, 900, 0, y, fill = "black", width = 3)
    time.sleep(1)
Как сделать, чтобы работало правильно?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.05.2019, 14:32
Ответы с готовыми решениями:

Сделать задержку при рисовании
При выполнении лабораторной работы необходимо ввести программную задержку. Попробовал использовать glfwWaitEventsTimeout(1000), но не...

Как сделать задержку при рисовании?
Доброго времени суток. Надо нарисовать снежинку Коха 2 порядка, программа ее рисует, в программе используется opengl Проблема в том,...

Сформировать задержку при выводе результата
Доброго времени суток Очень тупой вопрос : как сделать задержку при выводе значений на монитор? В общем пишу лабораторную, в которой...

5
Эксперт Python
5437 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.05.2019, 15:15
Вы не можете использовать time.sleep() в графическом интерфейсе (который работает в основном потоке приложения). Неважно в каком. В любом GUI есть свой цикл обработки событий, а sleep просто усыпляет всю программу целиком.
Изучите документацию по tkinter и его методам задержки main loop.
1
Эксперт Python
 Аватар для dondublon
4644 / 2060 / 363
Регистрация: 17.03.2012
Сообщений: 10,141
Записей в блоге: 6
02.05.2019, 16:36
Интересно, зачем. Линии рисуются одни и те же.
0
21 / 21 / 8
Регистрация: 07.01.2009
Сообщений: 556
02.05.2019, 18:05  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Изучите документацию по tkinter и его методам задержки main loop.
Переделывал так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import tkinter
import random
window = tkinter.Tk()
canvas = tkinter.Canvas(window, width=1200, height=900, bg="white")
canvas.pack()
y = random.randint(1, 900)
def line1(y,x):
    canvas.create_line(0,y, x, 0, fill = "black", width = 3)
def line2(x,y):
    canvas.create_line(x, 0, 1200, y, fill = "black", width = 3)
def line3(y,x):
    canvas.create_line(1200, y, x, 900, fill = "black", width = 3)
def line4(x,y):
    canvas.create_line(x, 900, 0, y, fill = "black", width = 3)
for i in range(1, 11):
    x = random.randint(1, 1200)
    window.after(100,line1(y,x))    
    y = random.randint(1, 900)
    window.after(200,line2(x,y))    
    x = random.randint(1, 1200)
    window.after(300,line3(y,x))    
    y = random.randint(1, 900)
    window.after(400,line4(x,y))
Эффект тот же, сначала отрабатывает пауза в цикле, затем мгновенная отрисовка без задержек.
Цитата Сообщение от dondublon Посмотреть сообщение
Интересно, зачем. Линии рисуются одни и те же.
Показать ребёнку какие визуальные эффекты можно сделать маленькой программкой всего лишь в несколько строк.
Луч должен последовательно отражаться под разными углами внутри прямоугольного окна.
0
Эксперт Python
 Аватар для dondublon
4644 / 2060 / 363
Регистрация: 17.03.2012
Сообщений: 10,141
Записей в блоге: 6
02.05.2019, 18:07
pivogol, а, ну окей.
В Qt много всякого такого. Там и таймер простой, и анимации.
0
Эксперт Python
5437 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
02.05.2019, 18:53
Лучший ответ Сообщение было отмечено pivogol как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import tkinter
import random
 
def line1(y,x):
    canvas.create_line(0,y, x, 0, fill = "black", width = 3)
def line2(x,y):
    canvas.create_line(x, 0, 1200, y, fill = "black", width = 3)
def line3(y,x):
    canvas.create_line(1200, y, x, 900, fill = "black", width = 3)
def line4(x,y):
    canvas.create_line(x, 900, 0, y, fill = "black", width = 3)
 
def main():
    
    y = random.randint(1, 900)  
    for i in range(1, 11):
        x = random.randint(1, 1200)
        window.after(100,line1(y,x))    
        y = random.randint(1, 900)
        window.after(200,line2(x,y))    
        x = random.randint(1, 1200)
        window.after(300,line3(y,x))    
        y = random.randint(1, 900)
        window.after(400,line4(x,y))
        window.update()
    
if __name__ =="__main__":
     
    window = tkinter.Tk()
    canvas = tkinter.Canvas(window, width=1200, height=900, bg="white")
    button = tkinter.Button(window , text="СТАРТ", command=main)
    button.pack()
    canvas.pack()
    window.mainloop()
Так пойдет?
Для запуска рисования нажмите кнопку Старт. Можно еще добавить кнопку для очистки канваса, чтобы рисовать заново, иначе новый старт по кнопке будет рисовать поверх уже имеющегося рисунка.

Добавлено через 4 минуты
P.S. window.update() можно добавить после отрисовки каждой линии, чтобы линии отображались именно по одной штуке.

Добавлено через 5 минут
Для очистки холста после первой кнопки добавить еще одну:
Python
1
2
    button2 = tkinter.Button(window, text="ОЧИСТИТЬ", command=lambda: canvas.delete(tkinter.ALL))
    button2.pack()
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.05.2019, 18:53
Помогаю со студенческими работами здесь

Как реализовать задержку в цикле?
Всем привет! Не могу реализовать следующую задачу. Есть 5 Panel как сделать так, чтобы они меняли цвет в цикле с задержкой времени.? ...

Создать задержку по времени в цикле средствами Qt
Методом штудирования книги макса шлее нашел единственный способ сделать задержку кода - в QTime есть статический метод вызывающий заданный...

Сформировать программную задержку
Всем привет! Подскажите пожалуйста как сформировать программную задержку длительностью 15. Сначала как я понял в P1 записывается 0, а потом...

Как организовать задержку в мсек в функции, которая выполняется в непрерывном цикле таймера?
Всем здравствуйте. В непрерывном цикле таймера крутится некоторая функция. __fastcall TForm1::TForm1(TComponent* Owner) :...

Как правильно сформировать задержку?
Суть: имею сигнал с индукционного датчика. Снимаю его, усиливаю компаратором, завожу на таймер T0 Attiny13. Таймер считает, выдаёт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Рисование коллайдеров Box2D v2 на Three.js с помощью порта @box2d/core
8Observer8 06.06.2025
Используется порт Box2D v2 под названием @box2d/ core - пакет NPM. Загрузил документацию Box2D v2 на Netlify: https:/ / box2d-v2-docs. netlify. app/ Документацию Box2D v2 можно скачать с официального. . .
Как создать стек в Python
AI_Generated 05.06.2025
Как архитектор с более чем десятилетним опытом работы с Python, я неоднократно убеждался, что знание низкоуровневых механизмов работы стеков дает конкурентное преимущество при решении сложных задач. . . .
Server-Sent Events (SSE) в Node.js
run.dev 05.06.2025
Потоковая передача данных с сервера прямо в браузер стала повседневной потребностью - от биржевых графиков и спортивных трансляций до чатов и умных дашбордов. Много лет разработчики полагались на. . .
Создаем RESTful API на Golang с Fiber
golander 04.06.2025
Я перепробовал десятки фреймворков для создания RESTful API за последние годы, и когда впервые столкнулся с Fiber, понял, что это совсем другой уровень. Нет, я не собираюсь рассказывать сказки о. . .
Как работать с куки в ASP.NET Core
UnmanagedCoder 04.06.2025
Когда я впервые начал работать с куки в ASP. NET Core, меня поразило, насколько отличается работа с ними от классического ASP. NET. В Core все стало более декомпозированным - больше нет удобного. . .
Рисование коллайдеров физического движка Box2D-WASM v3 на Three.js
8Observer8 04.06.2025
Erin Catto (автор Box2D) переписал с нуля Box2D v2 с С++ на Си и появилась версия Box2D v3. Birch-san собрал Box2D v3 в WebAssembly (WASM), чтобы можно было использовать Box2D v3 на JavaScript. В. . .
Worker Threads и многопоточность в Node.js
Reangularity 03.06.2025
Если вы когда-нибудь посещали собеседования на позицию Node. js разработчика, почти наверняка слышали заезженную фразу: "Node. js - однопоточная платформа". Звучит как неоспоримый факт, который. . .
Event-Driven CQRS на C# с паттерном Outbox
stackOverflow 03.06.2025
В традиционной модели происходит примерно следующее: вы получаете команду, обрабатываете ее, сохраняете результат в базу данных и затем пытаетесь опубликовать событие в брокер сообщений. Но что если. . .
OwenLogic: перенос сетевых переменных в панель Weintek (EasyBuilder Pro)
ФедосеевПавел 03.06.2025
ВВЕДЕНИЕ ПЕРЕД ЭКСПЕРИМЕНТАМИ - СОЗДАЙТЕ РЕЗЕРВНЫЕ КОПИИ ПРОЕКТОВ На момент написания статьи (02 июня 2025 г. ) самыми актуальными версиями ПО являются: OwenLogic v. 2. 10. 366 EasyBuilder Pro. . .
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »