Как ввести задержку между обновлениями виджетов на холсте tkinter? - PullRequest
0 голосов
/ 26 января 2019

Я новичок в Python. Я использую версию 3.6.7 на Ubuntu 18.04 LTS. Приведенный ниже код является просто примером теста для более крупного сценария, который я хочу написать для имитации массива светодиодов, которые могут принимать значения типа байтов и отражать их в своем состоянии вывода. Я решил использовать Tkinter и объект виджета Canvas для отображения и обновления состояний светодиодов. Проблема, с которой я столкнулся, заключается в том, что я хочу ввести задержку перед тем, как светодиод изменит состояние (в этом случае с выключенного на включенное).

Что действительно происходит, когда я запускаю этот код, так это то, что предполагаемая задержка происходит до появления окна tkinter, виджета canvas и светодиода. Когда все наконец появляется, светодиод уже находится в своем конечном состоянии (включен), поэтому состояние ВЫКЛ даже не показывалось (или оно было слишком быстрым). Как можно сначала отобразить окно, холст и светодиодный индикатор ВЫКЛ, затем задержку в 2 секунды и, наконец, состояние переключения светодиодов с выключенного на включенное? Спасибо.

# LED simulation using tkinter canvas widget

from tkinter import *
import time

root = Tk()
root.geometry('800x600')
root.title('LED Simulation')

canvas = Canvas(width=640, height=480)
canvas.pack()

# create an LED object in the OFF state (dark red filled circle)
d7 = canvas.create_oval(50, 50, 100, 100, fill='dark red')

# wait in this OFF state for 2 secs
time.sleep(2)

# change the LED state from OFF to ON (light red filled circle)
canvas.itemconfig(d7, fill='light red')

# is this even needed?
canvas.update()

root.mainloop() 

1 Ответ

0 голосов
/ 26 января 2019

Sleep() приостановит основной цикл, что означает, что обновления не будут производиться.Попробуйте вместо этого использовать after():

# LED simulation using tkinter canvas widget

from tkinter import *

root = Tk()
root.geometry('800x600')
root.title('LED Simulation')

canvas = Canvas(width=640, height=480)
canvas.pack()

# create an LED object in the OFF state (dark red filled circle)
d7 = canvas.create_oval(50, 50, 100, 100, fill='dark red')

# change the LED state from OFF to ON (light red filled circle)
def change_color():
    canvas.itemconfig(d7, fill='green')

# wait in this OFF state for 2 secs
root.after(1000, change_color) # Run after 1000 milliseconds

root.mainloop() 

Изменил цвет ON на «зеленый», так как мой Python не смог найти цвет, светло-красный ».

...