PYGTK a PYGI: gtk.timeout_add equivalente

9

He convertido un código de Python para usar PYGI pero no puedo entender cómo convertir esta línea:

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

Claramente, como realmente no sé la diferencia entre PYGTK y PYGI, mi nuevo código usa

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

como se muestra aquí https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

El código completo que estoy tratando de convertir está aquí http://pastebin.com/raw.php?i=aUtASRpy

¿Cuál es el equivalente de

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

en PYGI?

También estoy asumiendo que PYGI es la forma más moderna de hacer un indicador de unidad

También supongo que es mejor que el indicador verifique el estado de algo en lugar de que algo le diga al indicador el estado (push vs pull). ¿Está bien que un programa de Python verifique algo cada segundo?

¡Gracias!

onBootQuestioner
fuente

Respuestas:

1

Es mejor hacer una pregunta por ... err ... pregunta.

La biblioteca estándar de Python tiene un threadingmódulo que tiene una Timerclase que hace exactamente lo que necesita. Documentación .

En cuanto a push vs pull: definitivamente es mejor cuando su aplicación recibe una notificación cuando algo sucede (push) en lugar de verificar si algo sucedió cada segundo (pull): "¿ya llegamos? ¿Ya llegamos? ¿Ya llegamos?". . "- porque permite que su aplicación simplemente duerma y no haga nada hasta que sea notificada, en lugar de hacer la misma verificación cada segundo. Sin embargo, la cuestión es que para algunos tipos de actividades puede ser complicado recibir una notificación, por lo que depende de la naturaleza de su aplicación. Hacer controles con demasiada frecuencia también es malo para la vida útil de la batería y otras cosas.

Sergey
fuente
Gracias, esto me llevó a hackear este pastebin.com/raw.php?i=0jLxZ994 con gran ayuda de stackoverflow.com/questions/9812344/… Pero, ahora es el momento de aprender cómo hacer algún tipo de oyente ya que con qué Tengo en mente que la mayoría de las "encuestas" descubrirán que nada ha cambiado, pero eso es para otro momento. ¡Gracias!
onBootQuestioner
19

Solo para asegurarse de que la forma Gtk también esté presente en una respuesta:

El equivalente de

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

en la introspección gobject (PyGI) es:

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

Sin embargo, cuando verifique algo regularmente cada x segundos, debe usar

GLib.timeout_add_seconds(PING_FREQUENCY, self.doWork)

Esto permite que Glib agrupe temporizadores y, por lo tanto, ahorre energía, lo cual es importante para los dispositivos móviles. De la documentación :

La agrupación de temporizadores para disparar al mismo tiempo da como resultado un comportamiento más eficiente y más eficiente de la CPU, por lo que si su temporizador está en múltiplos de segundos y no necesita el primer temporizador exactamente un segundo a partir de ahora, el uso de glib.timeout_add_seconds ( ) se prefiere sobre glib.timeout_add ().

xubuntix
fuente
44
Esto parece mucho mejor que usar subprocesos. Especialmente porque el enhebrado puede causar errores extraños y bloqueos si realmente no sabes lo que estás haciendo.
Timo