Модуль gobject API PyGTK имеет полезную функцию для создания функции тайм-аута, которая будет вызываться периодически.
source_id = gobject.timeout_add(interval, function, …)
Второй аргумент — это функция обратного вызова, которую вы хотите вызывать после каждой миллисекунды, которая является значением первого аргумента — интервала. Дополнительные аргументы могут быть переданы в обратный вызов в виде данных функции.
Возвращаемое значение этой функции — source_id . Используя его, функция обратного вызова останавливается от вызова.
gobject.source_remove(source_id)
Функция обратного вызова должна возвращать True для продолжения повторения. Следовательно, его можно остановить, вернув False.
Две кнопки и две метки помещаются в окно верхнего уровня в следующей программе. Одна метка отображает увеличивающийся номер. Btn1 вызывает on_click, который устанавливает функцию тайм-аута с интервалом 1000 мс (1 секунда).
btn1.connect("clicked", self.on_click) def on_click(self, widget): self.source_id = gobject.timeout_add(1000, counter, self)
Функция тайм-аута называется counter () . Это увеличивает число на этикетке после каждой 1 секунды.
def counter(timer): c=timer.count+1 print c timer.count=c timer.lbl.set_label(str(c)) return True
Функция обратного вызова на второй кнопке удаляет функцию тайм-аута.
btn2.connect("clicked", self.on_stop) def on_stop(self, widget): gobject.source_remove(self.source_id)
пример
Ниже приведен полный код для примера Timeout —
import gtk, gobject def counter(timer): c = timer.count+1 print c timer.count = c timer.lbl.set_label(str(c)) return True class PyApp(gtk.Window): def __init__(self): super(PyApp, self).__init__() self.set_title("Timeout Demo") self.set_size_request(300, 200) self.set_position(gtk.WIN_POS_CENTER) vbox = gtk.VBox(False, 5) hbox = gtk.HBox(True, 3) hb = gtk.HBox() lbl1 = gtk.Label("Counter: ") hb.add(lbl1) self.lbl = gtk.Label("") hb.add(self.lbl) valign = gtk.Alignment(0.5, 0.5, 0, 0) valign.add(hb) vbox.pack_start(valign, True, True, 10) btn1 = gtk.Button("start") btn2 = gtk.Button("stop") self.count = 0 self.source_id = 0 hbox.add(btn1) hbox.add(btn2) halign = gtk.Alignment(0.5, 0.5, 0, 0) halign.add(hbox) vbox.pack_start(halign, False, True, 10) self.add(vbox) btn1.connect("clicked", self.on_click) btn2.connect("clicked", self.on_stop) self.connect("destroy", gtk.main_quit) self.show_all() def on_click(self, widget): self.source_id = gobject.timeout_add(1000, counter, self) def on_stop(self, widget): gobject.source_remove(self.source_id) PyApp() gtk.main()
Когда выполнено, окно показывает две кнопки внизу. Число на метке будет периодически увеличиваться при нажатии на кнопку «Пуск», и оно прекращает увеличиваться при нажатии на кнопку «Стоп».
Соблюдайте вывод —