Da PYGTK a PYGI: equivalente gtk.timeout_add


9

Ho convertito un po 'di codice Python per usare PYGI ma non riesco a capire come convertire questa riga:

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

Per chiaro, dal momento che non conosco davvero la differenza tra PYGTK e PYGI, il mio nuovo codice utilizza

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

come mostrato qui https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators#Python_version

Il codice completo che sto cercando di convertire è qui http://pastebin.com/raw.php?i=aUtASRpy

Qual è l'equivalente di

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

in PYGI?

Suppongo anche che PYGI sia il modo più moderno di creare un indicatore di unità

Suppongo anche che sia meglio che l'indicatore controlli lo stato di qualcosa piuttosto che qualcosa che indichi all'indicatore lo stato (push vs pull). Va bene avere un programma Python che controlla qualcosa ogni secondo?

Grazie!

Risposte:


1

È meglio fare una domanda per ... err ... domanda.

La libreria standard di Python ha un threadingmodulo che ha una Timerclasse che fa esattamente ciò di cui hai bisogno. Documentazione .

Per quanto riguarda push vs pull - è sicuramente meglio quando la tua applicazione riceve una notifica quando succede qualcosa (push) invece di verificare se qualcosa è successo ogni secondo (pull) - "siamo già arrivati? Siamo ancora arrivati? Siamo ancora lì ?. . "- perché consente alla tua app di dormire e non fare nulla fino a quando non viene notificata, anziché eseguire lo stesso controllo ripetuto ogni secondo. Il fatto è, tuttavia, che per alcuni tipi di attività può essere difficile ottenere una notifica, quindi dipende dalla natura della tua applicazione. Fare controlli troppo spesso fa male anche alla durata della batteria e ad altre cose.


Grazie, questo mi ha portato ad hackerare insieme questo pastebin.com/raw.php?i=0jLxZ994 con il grande aiuto di stackoverflow.com/questions/9812344/… Ma ora è il momento di imparare a fare una sorta di ascoltatore da quando Ho in mente che la maggior parte dei "sondaggi" scoprirà che nulla è stato cambiato, ma che è per un'altra volta. Grazie!
onBootQuestioner il

19

Solo per assicurarsi che il modo Gtk sia presente anche in una risposta:

L'equivalente di

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

in gobject introspection (PyGI) è:

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

Tuttavia, quando si controlla qualcosa regolarmente ogni x secondi, è necessario utilizzare

GLib.timeout_add_seconds(PING_FREQUENCY, self.doWork)

Ciò consente a Glib di raggruppare i timer e quindi di risparmiare energia, il che è importante per i dispositivi mobili. Dalla documentazione :

Il raggruppamento di timer da attivare contemporaneamente comporta un comportamento più efficiente in termini di potenza e CPU, quindi se il timer è in multipli di secondi e non è necessario il primo timer esattamente a un secondo da ora, l'uso di glib.timeout_add_seconds ( ) è preferito su glib.timeout_add ().


4
Questo sembra molto meglio dell'utilizzo del threading. Soprattutto dal momento che il threading può causare strani bug e blocchi se non sai davvero cosa stai facendo.
Timo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.