PYGTK to PYGI: эквивалент gtk.timeout_add

9

Я преобразовал некоторый код Python для использования PYGI, но я не могу понять, как преобразовать эту строку:

gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork)

Понятно, что поскольку я действительно не знаю разницу между PYGTK и PYGI, мой новый код использует

from gi.repository import Gtk
from gi.repository import AppIndicator3 as appindicator

как показано здесь https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Полный код, который я пытаюсь преобразовать, находится здесь http://pastebin.com/raw.php?i=aUtASRpy

Что является эквивалентом

gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork)

в ПЫГИ?

Я также предполагаю, что PYGI - самый современный способ сделать индикатор единства

Я также предполагаю, что для индикатора лучше проверить состояние чего-либо, а не что-то, чтобы сообщить индикатору состояние (push vs pull). Можно ли, чтобы программа на Python проверяла что-то каждую секунду?

Спасибо!

onBootQuestioner
источник

Ответы:

1

Лучше задавать один вопрос на каждый вопрос.

Стандартная библиотека Python имеет threadingмодуль, который имеет Timerкласс, который делает именно то, что вам нужно. Документация .

Что касается push vs pull - определенно лучше, когда ваше приложение получает уведомление, когда что-то происходит (push), вместо того, чтобы проверять, происходит ли что-то каждую секунду (pull) - «мы уже здесь? Мы уже здесь? Мы уже там?». . "- потому что это позволяет вашему приложению просто спать и ничего не делать, пока не получит уведомление, в отличие от повторяющейся проверки каждую секунду. Однако дело в том, что для некоторых видов деятельности может быть сложно получить уведомление, поэтому это зависит от характера вашего приложения. Слишком частое выполнение проверок также вредно для батареи и других вещей.

Сергей
источник
Спасибо, это заставило меня взломать этот pastebin.com/raw.php?i=0jLxZ994 с большой помощью stackoverflow.com/questions/9812344/… Но, теперь пришло время узнать, как сделать своего рода слушателя, так как с чем Я имею в виду, что большинство «опросов» обнаружат, что ничего не изменилось, но это в другой раз. Спасибо!
onBootQuestioner
19

Просто чтобы убедиться, что путь Gtk также присутствует в ответе:

Эквивалент

gtk.timeout_add(PING_FREQUENCY * 1000, self.doWork)

в интроспекции объекта (PyGI) есть:

from gi.repository import GLib
GLib.timeout_add(PING_FREQUENCY * 1000, self.doWork)

Однако, проверяя что-то регулярно каждые x секунд, вы должны использовать

GLib.timeout_add_seconds(PING_FREQUENCY, self.doWork)

Это позволяет Glib группировать таймеры и, следовательно, экономить энергию, что важно для мобильных устройств. Из документации :

Группировка таймеров для одновременного срабатывания приводит к более эффективному энергопотреблению и эффективности процессора, поэтому, если ваш таймер работает с кратными секундами и вам не требуется первый таймер ровно через одну секунду, используйте glib.timeout_add_seconds ( ) предпочтительнее glib.timeout_add ().

xubuntix
источник
4
Это выглядит намного лучше, чем использование потоков. Тем более, что многопоточность может вызывать странные ошибки и зависания, если вы действительно не знаете, что делаете.
Тимо