PYGTK para PYGI: equivalente em gtk.timeout_add

9

Eu converti algum código Python para usar PYGI, mas não consigo descobrir como converter esta linha:

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

Para esclarecer, como eu realmente não sei a diferença entre PYGTK e PYGI, meu novo código usa

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

como mostrado aqui https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

O código completo que estou tentando converter está aqui http://pastebin.com/raw.php?i=aUtASRpy

Qual é o equivalente de

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

em PYGI?

Também estou assumindo que PYGI é a maneira mais moderna de criar um indicador de unidade

Também suponho que é melhor para o indicador verificar o estado de algo em vez de algo informar ao indicador o estado (push vs pull). Tudo bem ter um programa python verificando algo a cada segundo?

Obrigado!

onBootQuestioner
fonte

Respostas:

1

É melhor fazer uma pergunta por ... err ... pergunta.

A biblioteca padrão do Python possui um threadingmódulo que possui uma Timerclasse que faz exatamente o que você precisa. Documentação .

Em relação ao push vs pull - é definitivamente melhor quando seu aplicativo recebe uma notificação quando algo acontece (push) em vez de verificar se algo aconteceu a cada segundo (pull) - "já chegamos? Estamos lá ainda?" . "- porque permite que seu aplicativo durma e não faça nada até ser notificado, em vez de fazer a mesma verificação repetida a cada segundo. O fato é que, para alguns tipos de atividades, pode ser complicado obter uma notificação, portanto depende da natureza do seu aplicativo. Fazer verificações com muita frequência também é ruim para a duração da bateria e outras coisas.

Sergey
fonte
Obrigado, isso me levou a hackear este pastebin.com/raw.php?i=0jLxZ994 com grande ajuda de stackoverflow.com/questions/9812344/… Mas, agora é a hora de aprender a fazer algum tipo de ouvinte, pois com o que Eu tenho em mente que a maioria das "pesquisas" descobrirá que nada foi alterado, mas isso é para outra época. Obrigado!
OnBootQuestioner
19

Apenas para garantir que a maneira Gtk também esteja presente em uma resposta:

O equivalente a

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

na introspecção gobject (PyGI) é:

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

No entanto, ao verificar algo regularmente a cada x segundos, você deve usar

GLib.timeout_add_seconds(PING_FREQUENCY, self.doWork)

Isso permite que o Glib agrupe temporizadores e, portanto, economize energia, o que é importante para dispositivos móveis. A partir da documentação :

O agrupamento de cronômetros para disparar ao mesmo tempo resulta em um comportamento mais eficiente em termos de energia e CPU. Se o cronômetro estiver em múltiplos de segundos e você não precisar do primeiro cronômetro exatamente daqui a um segundo, use glib.timeout_add_seconds ( ) é preferível a glib.timeout_add ().

xubuntix
fonte
4
Isso parece muito melhor do que usar rosqueamento. Especialmente porque o encadeamento pode causar bugs e travamentos estranhos, se você realmente não sabe o que está fazendo.
Timo