Постоянно читайте файл и обновляйте приложение Python GTK соответственно - PullRequest
0 голосов
/ 02 декабря 2011

Я работаю над проектом распознавания жестов.Есть программа на C, которая захватывает жесты с видео и записывает их в файл.Теперь у меня есть программа просмотра изображений, написанная на Python - GTK.Он переключается на следующее или предыдущее окно в соответствии с жестами.Это постоянное чтение файла и обновление приложения определяется следующим образом:

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()

Теперь, если я закомментирую рекурсивный вызов здесь, тогда приложение работает после чтения существующего файла и обновления изображений.Конечно, потом он не обновляется.

Но если я раскомментирую рекурсивный вызов, консоль продолжает работать, но приложение просмотра изображений перестает отвечать.

Есть ли способ выполнить эту функцию?Любое событие, где я мог бы связать эту ai() функцию, которая могла бы проверять наличие обновлений файлов каждый раз, когда это событие запускается ... Любая помощь будет оценена.

Ответы [ 3 ]

6 голосов
/ 02 декабря 2011

Не уверен, правильно ли я вас понимаю, но я ожидаю, что вы хотите запланировать вызов на ai() в вашем основном цикле GTK , чтобы ваша программа проверяла наличие вводана регулярной основе.

Если это то, что вам нужно, у вас есть два варианта: периодически планировать вызов или планировать вызов на время простоя программы (она больше ничего не делает).

Ваш код должен выглядетьчто-то вроде:

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

Документация должна быть здесь , но в настоящее время существует ошибка сервера.Вот соответствующие отрывки:

Функция gobject.idle_add() добавляет функцию (указанную обратным вызовом), которая вызывается всякий раз, когда нет событий с более высоким приоритетом, ожидающих основного цикла по умолчанию,Функция имеет приоритет по умолчанию для бездействия gobject.PRIORITY_DEFAULT_IDLE.Дополнительные аргументы для передачи в обратный вызов могут быть указаны после обратного вызова.Приоритет простоя может быть указан как пара ключевое слово-значение с ключевым словом «приоритет».Если обратный вызов возвращает FALSE, он автоматически удаляется из списка источников событий и больше не будет вызываться.

Функция gobject.timeout_add() устанавливает функцию (указанную с помощью обратного вызова) для вызова врегулярные интервалы (задаются через интервал, с приоритетом по умолчанию, gobject.PRIORITY_DEFAULT. Дополнительные аргументы для передачи обратному вызову могут быть указаны после обратного вызова. Приоритет простоя может быть указан как пара ключевое слово-значение с ключевым словом «priority».

Подвох: у вас есть обратные вызовы для возврата True, если вы хотите сохранить их в планировщике, в противном случае они будут выполняться только один раз.

HTH!

2 голосов
/ 02 декабря 2011

Отказ от ответственности: я не имею никакого опыта использования pygtk.

Я думаю, чтобы сделать это, вам нужно позволить циклу событий GTK вызывать ваш код (ваш рекурсивный вызов делает так, чтобы управление никогда не возвращалось кцикл обработки событий).

Возможно, у вас есть два варианта:

  • Либо настроить событие таймера для вызова вашего метода каждые nnn миллисекунд ( учебник )
  • Или используйте какое-либо событие бездействия для вызова вашего метода всякий раз, когда программа GTK в противном случае бездействует ( учебное пособие )
1 голос
/ 02 декабря 2011

Поскольку вы используете gtk, вы можете использовать модуль gio для мониторинга за вас, вместо собственного решения для периодического опроса состояния файла:

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

Обратите внимание, что вы можете подключить сигнал changed к вашему обратному вызову для выполнения любого необходимого обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...