Таймеры-потоки против таймеров. графического интерфейса

tajmery potoki protiv tajmerov graficheskogo interfejsa Системные инструменты параллельного выполнения

Интересно отметить, что модуль 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

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