Je travaille sur un projet de reconnaissance gestuelle. Il existe un programme C qui capture les gestes de l'entrée vidéo et les écrit dans le fichier. Maintenant, j'ai une visionneuse d'images écrite en Python - GTK. Il passe à la fenêtre suivante ou précédente en fonction des gestes. Cette lecture continue des fichiers et la mise à jour de l'application sont définies comme suit:

def ai(self):
        if self.mtime!=os.stat("input.txt").st_mtime:
            self.mtime=os.stat("input.txt").st_mtime
            inp=open("input.txt", "r");
            line=inp.read()
            if len(line)!=0:
                line=line[0:len(line)-1]
                for x in line.split(' '):
                    y=x.split('-')
                    if(y[1]=="R"):
                        self.next()
                        print "Move Right"
                    elif(y[1]=="L"):
                        self.prev()
                        print "Move Left"
        time.sleep(1)
        print "WakeUp"
        self.ai()

Maintenant, si je commente l'appel récursif ici, l'application fonctionne après avoir lu le fichier actuel et mis à jour les images. Bien sûr, il ne se met pas à jour par la suite.

Mais si je décommente l'appel récursif, la console continue de fonctionner mais l'application de visualisation d'images cesse de répondre.

Existe-t-il un moyen d'exécuter cette fonction? Tout événement où je pourrais lier cette fonction ai() qui pourrait vérifier les mises à jour de fichiers chaque fois que cet événement est déclenché ... Toute aide serait appréciée.

0
Nishchay Sharma 2 déc. 2011 à 12:35

3 réponses

Meilleure réponse

Je ne sais pas si je vous comprends bien, mais je m'attends à ce que vous vouliez faire est de planifier un appel à ai() dans votre boucle GTK principale , afin que votre programme vérifie s'il y a une entrée sur une base régulière.

Si c'est ce que vous voulez, vous avez deux choix: planifier périodiquement l'appel ou planifier l'appel lorsque le programme est inactif (il ne fait rien d'autre).

Votre code devrait ressembler à:

gobject.idle_add(callback, ...)  #execute callback when idle
gobject.timeout_add(interval, callback, ...)  #execute callback every interval millisecs

La documentation doit être ici mais il y a actuellement une erreur de serveur. Voici les passages pertinents:

La fonction gobject.idle_add() ajoute une fonction (spécifiée par rappel) à appeler chaque fois qu'aucun événement de priorité supérieure n'est en attente dans la boucle principale par défaut. La fonction reçoit la priorité d'inactivité par défaut, gobject.PRIORITY_DEFAULT_IDLE. Des arguments supplémentaires à passer au rappel peuvent être spécifiés après le rappel. La priorité inactive peut être spécifiée sous la forme d'une paire mot-clé-valeur avec le mot-clé "priorité". Si le rappel renvoie FAUX, il est automatiquement supprimé de la liste des sources d'événements et ne sera plus appelé.

La fonction gobject.timeout_add() définit une fonction (spécifiée par rappel) à appeler à intervalles réguliers (spécifiée par intervalle, avec la priorité par défaut, gobject.PRIORITY_DEFAULT. Des arguments supplémentaires à transmettre au rappel peuvent être spécifié après rappel. La priorité inactive peut être spécifiée sous la forme d'une paire mot-clé-valeur avec le mot-clé "priorité".

Un hic: vous avez vos rappels à renvoyer True si vous voulez les conserver dans le planificateur, sinon, ils ne s'exécuteront qu'une seule fois.

HTH!

6
mac 2 déc. 2011 à 09:16

Puisque vous utilisez gtk, vous pouvez utiliser le module gio pour effectuer la surveillance à votre place, au lieu de votre propre solution personnalisée pour interroger périodiquement l'état du fichier:

monitor = gio.File(filename).monitor()
monitor.connect('changed', file_changed_cb)

Notez que vous pouvez connecter le signal changed à votre rappel pour effectuer toute mise à jour dont vous avez besoin.

1
jcollado 2 déc. 2011 à 09:26

Avis de non-responsabilité: je n'ai aucune expérience de l'utilisation de pygtk.

Je suppose que pour que cela fonctionne, vous devez laisser la boucle d'événements GTK appeler votre code (votre appel récursif fait en sorte que le contrôle ne revienne jamais à la boucle d'événements).

Vous avez probablement deux options:

  • Soit configurez un événement timer pour appeler votre méthode toutes les nnn millisecondes (tutoriel)
  • Ou utilisez une sorte d'événement inactif pour appeler votre méthode chaque fois que le programme GTK est inactif (tutoriel)
2
codeape 2 déc. 2011 à 09:08