Интересно отметить, что модуль threading экспортирует универсальную функцию Timer, которая, как и метод after виджетов в библиотеке tkinter, может использоваться для запуска другой функции по истечении указанного интервала времени:
Timer(N.M, somefunc).start() # вызовет функцию somefunc через N.M секунд
Объекты-таймеры имеют метод start(), запускающий таймер, а также метод cancel(), позволяющий отменить запланированное событие, а кроме того, ожидание в них реализовано в виде отдельного потока выполнения. Например, следующий пример выведет сообщение спустя 5.5 секунд:
>>> import sys
>>> from threading import Timer
>>> t = Timer(5.5, lambda: print(‘Spam!’)) # дочерний поток
>>> t.start()
>>> Spam!
Этот инструмент может пригодиться в самых разных ситуациях, но он не должен использоваться в графических интерфейсах: отложенная функция будет вызвана в контексте дочернего потока, а не в главном потоке графического интерфейса, поэтому она не должна выполнять изменения в графическом интерфейсе. Метод after из библиотеки tkinter, напротив, вызывается из цикла обработки событий главного потока выполнения и запускает указанную функцию в главном потоке, поэтому она свободно может изменять графический интерфейс.
Например, следующий пример выведет окно диалога через 5.5 секунд в контексте главного потока инструмента tkinter (в некоторых интерфейсах вам может также потребоваться запустить win. main loop()):
> >> from tkinter import Tk
> >> from tkinter.messagebox import showinfo
> >> win = Tk()
> >> win.after(5500, lambda: showinfo(‘Popup’, ‘Spam!’))
В последней строке здесь планируется однократный запуск функции в главном потоке выполнения графического интерфейса, но он не приостанавливает работу вызывающей программы и поэтому не блокирует графический интерфейс. Ниже приводится эквивалентная и более простая форма:
>>> win.after(5500, showinfo, ‘Popup’, ‘Spam’)
В следующей части книги, в главе 9, подробнее будет рассказываться о библиотеке tkinter и о методе after, а в главе 10 — о роли потоков выполнения в приложениях с графическим интерфейсом.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011