Использование метода after

ispolzovanie metoda after Экскурсия по tkinter, часть 2

Из всех инструментов, перечисленных выше, наиболее интересным является метод after. Он позволяет сценариям назначить обработчик, который будет вызван в некоторый момент времени в будущем. Несмотря на его простоту, он будет часто использоваться в последующих примерах. В частности, в главе 11 мы познакомимся с программой часов, которая с помощью метода after просыпается 10 раз в секунду и получает текущее время, а также с программой показа слайдов, которая с помощью метода after устанавливает интервал смены фотографий (программы PyClock и PyView). Для иллюстрации основ планирования вызова обработчиков служит пример 9.27.

Пример 9.27. PP4E\Gui\Tour\alarm.py

# мигает и издает сигнал каждую секунду, используя цикл с методом after() from tkinter import *

class Alarm(Frame):

def __init__(self, msecs=1000): # по умолчанию = 1 секунда

Frame.__init__(self)

self.msecs = msecs self.pack()

stopper = Button(self, text=’Stop the beeps!’, command=self.quit) stopper.pack()

stopper.config(bg=’navy’, fg=’white’, bd=8) self.stopper = stopper

self.repeater()

def repeater(self): # каждые N миллисекунд

self.bell() # подать сигнал

self.stopper.flash() # мигнуть кнопкой

self.after(self.msecs, self.repeater) # запланировать следующий вызов

if __name__ == ‘__main__’: Alarm(msecs=1000).mainloop()

Этот сценарий создает окно, изображенное на рис. 9.41, и периодически вызывает метод flash кнопки, заставляющий кнопку мигнуть (изменяет ее цвет на короткое время), и метод bell, который обращается к функции подачи звукового сигнала. Метод repeater вызывает методы beep и flash и с помощью метода after устанавливает обработчик, который будет выполнен через определенный промежуток времени.

Рис. 9.41. Прекратите пищать!

 

Метод after не останавливает вызывающий сценарий: обработчик вызывается в фоновом режиме, в то время как программа выполняет другую работу, — технически с того момента, когда цикл событий Tk получит возможность обнаружить изменение времени. Для этого метод repeater каждый раз вызывает after и заново устанавливает обработчик. Отложенные события являются одноразовыми: чтобы повторить событие, его нужно снова запланировать.

В итоге этот сценарий начинает подавать звуковые сигналы и мигать кнопкой, как только будет выведено его окно с одной кнопкой, и продолжает подавать сигналы и мигать снова и снова. Прочие действия и операции с графическим интерфейсом не влияют на это. Даже если свернуть окно, сигналы будут продолжаться, потому что события таймера tkinter генерируются в фоновом режиме. Чтобы прекратить сигналы, нужно закрыть окно или щелкнуть на кнопке. Изменив задержку msecs, можно заставить сигнал звучать так часто или так редко, как позволяет система (максимально допустимая частота может зависеть от платформы). Предупреждаю заранее, что это не лучшая демонстрационная программа для запуска в многолюдном помещении.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий