<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF128%3AClutter</id>
		<title>LXF128:Clutter - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki2.linuxformat.ru/index.php?action=history&amp;feed=atom&amp;title=LXF128%3AClutter"/>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF128:Clutter&amp;action=history"/>
		<updated>2026-05-13T22:23:22Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.11.1</generator>

	<entry>
		<id>http://wiki2.linuxformat.ru/index.php?title=LXF128:Clutter&amp;diff=11508&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki2.linuxformat.ru/index.php?title=LXF128:Clutter&amp;diff=11508&amp;oldid=prev"/>
				<updated>2011-03-10T12:47:27Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''Python''''' Реальные проекты для развития ваших навыков&lt;br /&gt;
&lt;br /&gt;
==''Clutter'': Пишем датчик скорости==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
: Используя код из ''Clutter'', '''Ник Вейч''' уведет вас от командной строки в новую реальность полноцветных графических приложений.&lt;br /&gt;
&lt;br /&gt;
Внашей серии уроков Python мы уже написали множество web-диковинок, но лишь изредка касались создания графического интерфейса (GUI). Одна из причин этого в том, что в большинстве случаев код GUI очень быстро разрастается, и обычная отрисовка на экране панели с несколькими кнопками способна съесть всю площадь статьи.&lt;br /&gt;
&lt;br /&gt;
Сделаем небольшой перерыв в недружелюбии к пользователю, поскольку в следующие месяцы мы будем создавать приложения с использованием библиотеки ''PyClutter''. Если вы не знакомы с ''Clutter'' [англ. «захламлять»], то обратитесь к врезке в конце. &lt;br /&gt;
&lt;br /&gt;
На первом уроке мы создадим небольшую, но полезную утилиту, чтобы разобраться в работе ''Clutter'' и ''PyClutter''. Поскольку ''Clutter'' используется пока не очень широко, то документации и примеров весьма не хватает; будем надеяться, что приведенный здесь код даст вам представление, как можно реально применять ''Clutter'' в приложениях ''Python''.&lt;br /&gt;
&lt;br /&gt;
Задача данного урока – создать программку, отображающую скорость вашего текущего интернет-соединения. Ну да, таких мониторов хватает и без нас, но этот будет наш собственный, и всего из 70 строк простого кода.&lt;br /&gt;
&lt;br /&gt;
Чтобы разобраться в ''Clutter'', начнем с терминологии. В отличие от других GUI-инструментариев, обычно определяющих объекты типа панелей или окон, ''Clutter'' рассматривает визуальную область как «сцену» [stage]. Продолжая аналогию – появляющиеся на ней (точнее, в ней, но это как-то нелепо звучит) объекты называют ся актерами [actor]. В процессе кодирования все станет понятнее, и названия уже не будут казаться странными. Особенность актеров в том, что они обладают большим количеством свойств, чем обычные виджеты, потому что на самом деле существуют в 3D-окружении, а не в 2D.&lt;br /&gt;
&lt;br /&gt;
===Зачем нужен ''Clutter''?===&lt;br /&gt;
&lt;br /&gt;
''Clutter'' – это лицензированная по GPL графическая и GUI-библиотека, изначально разработанная командой OpenedHand. Позднее ее продали Intel, которая продолжила дальнейшую разработку и развитие.&lt;br /&gt;
&lt;br /&gt;
Самое замечательное в ''Clutter'' – простота, скорость и мощные методы создания 3D-и 2D-графики на разных платформах. За кулисами в основном используется OpenGL, но, применяя библиотеку ''Clutter'', разработчики приобретают преимущества быстрого, эффективного и дружелюбного способа создания графических приложений без углубления в технические аспекты OpenGL-библиотек.&lt;br /&gt;
&lt;br /&gt;
''Clutter'' также формирует неотъемлемую часть Moblin, последнее слово в создании легковесной, но мощной графической версии Linux для мобильных устройств. Moblin в основном предназначена для устройств на базе Intel Atom, но работает и на других машинах.&lt;br /&gt;
&lt;br /&gt;
===Весь мир — сцена===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_72_1.jpg|200px]] Темновато… Но может служить началом приключенческой 3D-игры. Или первым шагом в создании вашего кода ''Clutter''!|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Прямо по Шекспиру. Но довольно гиперболтовни – все прояснится, когда мы начнем создавать код. Откройте свое обычное окружение ''Python'' (для меня это ''Bash'', но вы можете использовать нечто более симпатичное), и создайте первый скрипт ''Clutter''...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import clutter&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage = clutter.Stage()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage.set_size(500,300)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; red=clutter.Color(255,0,0,255)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; black=clutter.Color(0,0,0,255)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage.set_color(black)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage.show_all()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Налюбовавшись, щелкните по кнопке закрытия окна. Я понимаю, что пока не видно ничего замечательного, но потенциал здесь есть! Рассмотрим, что же произошло. Первая строка, очевидно, загружает модуль ''Clutter''. Далее ''Clutter'' сам открывает несколько модулей – это служебные механизмы, в конечном итоге подключающие системные библиотеки для вывода графики на экране. Следующим шагом мы создаем объект-сцену. Сцена – это вроде рамки видоискателя: область, в пределах которой действуют ваши актеры.&lt;br /&gt;
&lt;br /&gt;
Настройка атрибутов сводится к простому вызову методов класса '''stage''', в нашем случае это размер и цвет. Параметры для '''set_szie()''' – длины вдоль '''x''' и '''y''', а цвет берется из объекта '''clutter.Color''' (требующего значения RGB и альфа-канала). Как и в других инструментариях, прежде чем объект появится на экране, его необходимо сделать видимым – этим и занимается по следняя строка.&lt;br /&gt;
&lt;br /&gt;
Но что же с актерами – объектами, которые мы хотим показать на экране? Давайте добавим несколько текстовых надписей:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_73_1.jpg|200px]] Первое приложение — традиционное, но мы дерзнули опустить запятую.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; a=clutter.Text()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; a.set_font_name(“Sans 30”)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; a.set_colour(red)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; a.set_text (“Hello World!”)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; a.set_position(130,100)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage.add(a)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Мы добавили текстовый объект, нашего первого актера. Надеюсь, вам ясно, что делают эти методы: выбирается шрифт, цвет, задается текстовая строка и ее расположение. Последний вызов в коде примера добавляет актера на сцену, чтобы вы смогли его увидеть. А теперь с этим можно поиграть – попробуйте установить другую позицию или добавить цвета.&lt;br /&gt;
&lt;br /&gt;
Как я отметил ранее, документация к ''PyClutter'' скудна, но мы можем утешиться тем фактом, что ''Python'' – сам себе анализ. Попробуйте сейчас ввести '''dir(a)''', чтобы увидеть доступные методы и атрибуты этого объекта.&lt;br /&gt;
&lt;br /&gt;
Следующим шагом мы создадим работающий скрипт, но остался еще один момент: чтобы магия ''Clutter'' действовала, нужно передать ему управление приложением посредством функции '''clutter.main()''', предварительно предусмотрев выход из программы. В ситуациях, подобных нашей, ''Python'' перехватывает прерывание '''Ctrl+C''', и пока у нас нет шанса выйти: надо создать некоторые события клавиатуры.&lt;br /&gt;
&lt;br /&gt;
Когда окно сцены активно, ''Clutter'' воспринимает сигналы о нажатии клавиш. Все, что нам осталось – написать функцию, которая будет обрабатывать эти события и при нажатии некой клавиши выходить из основного цикла. Кроме того, можно назначить действия другим клавишам: например, для смена цвета сцены.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def parseKeyPress(self, event):&lt;br /&gt;
 ... if event.keyval == clutter.keysyms.q:&lt;br /&gt;
 ... clutter.main_quit()&lt;br /&gt;
 ... elif event.keyval == clutter.keysyms.r:&lt;br /&gt;
 ... self.set_color(red)&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; stage.connect(‘key-press-event’, parseKeyPress)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; clutter.main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=К вопросу о версиях|Содержание=Библиотека ''Clutter'', а следовательно, и модули ''Python'', использующие ее, недавно обновились до версии 1.0. Для обновлений обычна некоторая несовместимость между старой и новой версиями, но в данном случае в коде версий до и после 0.9 отличия фундаментальные. Модуль ''PyClutter'' и библиотека ''Clutter'' должны быть доступны в репозитории вашего дистрибутива, но после ее установки убедитесь, что вы получили версию 0.9 (лучше 1.0) или выше; в противном случае гарантирую, что код данного учебника работать не будет. Кто подумал «фи», пусть напишет учебник, а затем поинтересуется обновлениями библиотеки…|Ширина=250px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При запуске в интерактивной оболочке ''Python'' функция '''quit''' не приведет к выходу из самого ''Python'', и даже не уничтожит приложение, а просто передаст управление обратно оболочке. Однако при запуске скрипта вызов метода '''clutter.main_quit()''' на самом деле завершит приложение – ну, по крайней мере, его часть, связанную с ''Clutter''.&lt;br /&gt;
&lt;br /&gt;
===Время что-то отследить===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF128_74_1.jpg|200px]] Числа. Цветные. Они изменяются. И что-то отслеживают. По-моему, начало хорошее…|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Итак, интерфейс у нас готов, но как создать великолепный монитор трафика? Сперва определим, где взять текущую скорость. В таких случаях я всегда обращаюсь к моему старому другу '''proc'''. Да, псевдо-файловая система '''/proc''' – это кладезь всевозможных сведений о работающей Linux-машине; из всей беспорядочной мешанины файлов здесь нам нужен лишь '''/proc/net/dev'''. Это список всех сетевых устройств, и его просмотр даст нам статистику входящих и исходящих байтов, пакетов, пропущенных пакетов, ошибок и т. д. Нам сейчас интересны только полученные и отправленные байты. Я знаю, что указывается их количество, а нам необходи ма скорость, но узрите мощь '''proc''' – просто откройте файл вновь, и числа изменятся, как по волшебству. Надеюсь, вы поспеваете за мной и простая арифметика для нас не препятствие. Если открывать файл каждую секунду и вычитать старое число из нового, то вот вам и ответ.&lt;br /&gt;
&lt;br /&gt;
Короче, надо создать небольшую функцию, которая будет читать файл, выделять необходимую информацию и вычислять разность. Перед ее завершением будем сохранять старое число, чтобы вычитать его в следующий раз. Ниже показано, как примерно должна выглядеть функция:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 devfile=open(‘/proc/net/dev’,’r’)&lt;br /&gt;
 for line in devfile.readlines():&lt;br /&gt;
  line=line.strip()&lt;br /&gt;
  if (line[:4] == ‘eth0’):&lt;br /&gt;
   line=line[5:].split()&lt;br /&gt;
   print line[0], line[8]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Авось, вы разберетесь в ее коде и без блок-схемы. Мы читаем файл и проходим по строкам в поиске той, что начинается с '''eth0'''; перед сравнением вырезаются пробелы, которыми вывод дополняется для выравнивания таблицы. Обнаружив нужную строку, мы удаляем имя интерфейса и разбиваем ее, чтобы каждое значение стало элементом списка. Количества входящих и исходящих байтов будут находиться в 0‑й и 8‑й его позициях. Пока мы просто печатаем их – можете набрать наш код и посмотреть, что выведется. Необходимо добавить лишь преобразование строки в целое и его сохранение, и можно начинать отслеживать происходящее.&lt;br /&gt;
&lt;br /&gt;
===Поможет математика===&lt;br /&gt;
&lt;br /&gt;
Любители вникать в практические детали могут спросить: а как мы учтем время, занятое выполнением кода? Хотите засечь время выполнения этого кода – вперед: в моей системе на него требуется 0.0001 секунд. Если интересно, то полное приложение командной строки будет выглядеть так:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Скорая помощь|Содержание=Отслеживание версий может превратиться в кошмар, но большинство модулей хранит свои версии в '''&amp;lt;имя_модуля&amp;gt;.__version__ '''. Это может быть полезно не только для вас, но и для вашего приложения, которое может проверять совместимость версий перед тем, как сделать нечто хитроумное.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
 import time&lt;br /&gt;
 lasttime=1&lt;br /&gt;
 lastin=0&lt;br /&gt;
 lastout=0&lt;br /&gt;
 def getspeed():&lt;br /&gt;
 x=open(‘/proc/net/dev’,’r’)&lt;br /&gt;
 for line in x.readlines():&lt;br /&gt;
   line=line.strip()&lt;br /&gt;
   if (line[:4] == ‘eth0’):&lt;br /&gt;
     line=line[5:].split()&lt;br /&gt;
     bin=int(line[0])&lt;br /&gt;
     bout=int(line[8])&lt;br /&gt;
 return (bin, bout)&lt;br /&gt;
 while True :&lt;br /&gt;
   z= getspeed()&lt;br /&gt;
   timedelta=time.time()-lasttime&lt;br /&gt;
   lasttime=time.time()&lt;br /&gt;
   sin=(float(z[0]-lastin))/(1024*timedelta)&lt;br /&gt;
   sout=(float(z[1]-lastout))/(1024*timedelta)&lt;br /&gt;
   print sin, sout&lt;br /&gt;
   lastin=z[0]&lt;br /&gt;
   lastout=z[1]&lt;br /&gt;
   time.sleep(5)&lt;br /&gt;
&lt;br /&gt;
Сюда вставлена функция таймера для более точного расчета скорости, но, принимая во внимание, что речь идет о паре миллисекунд, большой разницы не ждите. Однако функция пригодится, если мы пожелаем изменить период времени где-нибудь в приложении.&lt;br /&gt;
&lt;br /&gt;
Теперь включим эту функциональность в приложение ''Clutter''. Мы могли бы просто воткнуть цикл в конец нашей программы и вообще не вызывать главный цикл ''Clutter''. Обновлять актера при необходимости все равно можно, но это будет '''Плохой Идеей'''. Более элегантный способ – вернуть актеру свободу и автономность и создать анимационную шкалу времени для управления его текстом.&lt;br /&gt;
&lt;br /&gt;
Шкала времени более подробно описана во врезке; а если в двух словах, то это просто таймер, ведущий счет до некоторого значения и затем выдающий программный эквивалент зуммера – сигнал. Сигнал можно перехватить и передать функции обратного вызова; кроме того, можно передать дополнительные параметры. Для наших целей мы можем заставить таймер вызывать функцию, запрашивающую скорость сети и обновляющую оба наших актера.&lt;br /&gt;
&lt;br /&gt;
Шкала времени и сама по себе объект, но, создавая связь между ней и функцией обратного вызова, мы можем передать последней и наши объекты-актеры, чтобы она могла изменять их непосредственно. Отметим, что если вы желаете более сложного поведения, то не запрещено использовать также и другие таймеры – при желании можно настроить один для ежесекундного изменения цвета объектов, и его не нужно увязывать с уже созданной шкалой времени. Шкалы времени могут использоваться как потоки в многопоточных приложениях – они не столь гибкие, но ими легче управлять, и они проще при работе с анимированными объектами, потому что можно отделить анимацию объектов от других связанных с ними взаимодействий.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 import clutter&lt;br /&gt;
 import time&lt;br /&gt;
 lasttime=1&lt;br /&gt;
 lastbin=0&lt;br /&gt;
 lastbout=0&lt;br /&gt;
 black =clutter.Color(0,0,0,255)&lt;br /&gt;
 red = clutter.Color(255, 0, 0, 255)&lt;br /&gt;
 green =clutter.Color(0,255,0,255)&lt;br /&gt;
 blue =clutter.Color(0,0,255,255)&lt;br /&gt;
 def updatespeed(t, a, b):&lt;br /&gt;
   global lasttime, lastbin, lastbout&lt;br /&gt;
   f=open(‘/proc/net/dev’,’r’)&lt;br /&gt;
   for line in f.readlines():&lt;br /&gt;
      line=line.strip()&lt;br /&gt;
            if (line[:4] == ‘eth0’):&lt;br /&gt;
         line=line[5:].split()&lt;br /&gt;
         bin=int(line[0])&lt;br /&gt;
         bout=int(line[8])&lt;br /&gt;
         timedelta=time.time()-lasttime&lt;br /&gt;
         lasttime=time.time()&lt;br /&gt;
         speedin=round((bin-lastbin)/(1024*timedelta), 2)&lt;br /&gt;
         speedout=round((bout-lastbout)/(1024*timedelta), 2)&lt;br /&gt;
         lastbin, lastbout = bin, bout&lt;br /&gt;
         a.set_text(str(speedin)+’KB/s’)&lt;br /&gt;
         xx, yy=a.get_size()&lt;br /&gt;
         a.set_position(int((300-xx)/2),int((100-yy)/2) )&lt;br /&gt;
         b.set_text(str(speedout)+’KB/s’)&lt;br /&gt;
         xx, yy=b.get_size()&lt;br /&gt;
         b.set_position(int((300-xx)/2),int((100-yy)/2)+100 )&lt;br /&gt;
 def parseKeyPress(self, event):&lt;br /&gt;
   # Опрашиваем клавиату ру&lt;br /&gt;
   # Вызывается объек том сцены&lt;br /&gt;
   if event.keyval == clutter.keysyms.q:&lt;br /&gt;
      #Вы ходим из тес та, ес ли поль зователь на жал “q”&lt;br /&gt;
      clutter.main_quit()&lt;br /&gt;
   elif event.keyval == clutter.keysyms.r:&lt;br /&gt;
      #де лаем объект красным при на жатии “r”&lt;br /&gt;
      self.set_color(red)&lt;br /&gt;
   elif event.keyval == clutter.keysyms.g:&lt;br /&gt;
      # де лаем объект зе леным при на жатии “g”&lt;br /&gt;
      self.set_color(green)&lt;br /&gt;
   elif event.keyval == clutter.keysyms.b:&lt;br /&gt;
      # де лаем объект синим при на жатии “b”&lt;br /&gt;
      self.set_color(blue)&lt;br /&gt;
   elif event.keyval == clutter.keysyms.Up:&lt;br /&gt;
      #стрелка вверх = де лаем объект черным&lt;br /&gt;
      self.set_color(black)&lt;br /&gt;
   print ‘event processed’, event.keyval&lt;br /&gt;
 stage = clutter.Stage()&lt;br /&gt;
 stage.set_size(300,200)&lt;br /&gt;
 stage.set_color(blue)&lt;br /&gt;
 stage.connect(‘key-press-event’, parseKeyPress)&lt;br /&gt;
 intext=clutter.Text()&lt;br /&gt;
 intext.set_font_name(“Sans 30”)&lt;br /&gt;
 intext.set_color(green)&lt;br /&gt;
 stage.add(intext)&lt;br /&gt;
 outtext=clutter.Text()&lt;br /&gt;
 outtext.set_font_name(“Sans 30”)&lt;br /&gt;
 outtext.set_color(red)&lt;br /&gt;
 stage.add(outtext)&lt;br /&gt;
 stage.show_all()&lt;br /&gt;
 t=clutter.Timeline()&lt;br /&gt;
 t.set_duration(5000)&lt;br /&gt;
 t.set_loop(True)&lt;br /&gt;
 t.connect(‘completed’, updatespeed, intext, outtext)&lt;br /&gt;
 t.start()&lt;br /&gt;
 clutter.main()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Здесь мы собрали воедино все элементы, изученные на этом уроке. Мы создали сцену, заселили ее актерами, а за тем воспользовались объектами ''Clutter'' типа «шкала времени», чтобы все обновлялось самостоятельно и согласно нашим капризам. Но мы лишь слегка коснулись графических возможностей ''Clutter''. Мы даже еще не затронули поведение и анимацию, не говоря уж об эффектах альфа-канала. Но верьте: они появятся вгрядущих проектах.&lt;br /&gt;
&lt;br /&gt;
===Все о таймерах===&lt;br /&gt;
&lt;br /&gt;
Библиотека ''Clutter'' использует объекты, называемые шкалой времени [timeline] для выполнения практически всего, что необходимо делать при работе приложения. Шкала времени – это пульс вашего скрипта, который гарантирует, что все по крайней мере пытается функционировать совместно.&lt;br /&gt;
&lt;br /&gt;
Шкала времени широко используется в ''Clutter'' для управления анимацией и эффектами, но ее также можно применять как самостоятельное прерывание для периодического вызова подпрограмм. Это достигается реакцией на сигналы для таких событий, как '''started, next-frame, completed''' и т. д. Каждый из этих сигналов можно связать с функцией обратного вызова для управления чем-то еще.&lt;br /&gt;
&lt;br /&gt;
Вот короткий пример, который можно ввести в оболочке ''Python'':&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import clutter&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; t=clutter.Timeline()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; t.set_duration(2000)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; t.set_loop(True)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def ping(caller):&lt;br /&gt;
 ... print caller&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; t.connect(‘completed’,ping)&lt;br /&gt;
 9L&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; t.start()&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; &amp;lt;clutter.Timeline object at 0xb779639c&lt;br /&gt;
 (ClutterTimeline at 0x95b9860)&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Надеюсь, методы объекта временной шкалы достаточно понятны. Длительность задается в миллисекундах. Затем шкала зацикливается. Здесь мы создали простую функцию с именем '''ping''', которая просто печатает передаваемый ей параметр. Затем мы связали подаваемый сигнал '''completed''' с функцией '''ping''' и запустили шкалу времени. Теперь без всякого дополнительного воздействия функция '''ping''' будет вызываться каждые две секунды позавершении отрезка временной шкалы, пока вы не закроете окружение ''Python''.&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>