连续读取文件并相应地更新Python GTK应用程序

时间:2011-12-02 08:35:27

标签: python events gtk

我正在开展一个手势识别项目。有一个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 个答案:

答案 0 :(得分:6)

我不确定我是否理解正确,但我希望您要做的是在主GTK循环中安排对ai()的呼叫,以便您的程序检查是否常规基础上有输入。

如果这是你想要的,你有两个选择:定期安排呼叫或安排程序空闲时的呼叫(它没有做任何其他事情)。

您的代码应该类似于:

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

文档应为here,但目前存在服务器错误。以下是相关段落:

  

gobject.idle_add() 函数添加一个函数(由回调指定),只要没有更高优先级事件挂起到默认主循环就会被调用。该函数被赋予默认的空闲优先级gobject.PRIORITY_DEFAULT_IDLE。可以在回调后指定传递给回调的其他参数。可以将空闲优先级指定为具有关键字“priority”的关键字 - 值对。如果回调返回FALSE,它将自动从事件源列表中删除,不会再被调用。

     

gobject.timeout_add() 函数设置一个函数(由回调指定)以定期间隔调用(由interval指定,默认优先级为gobject.PRIORITY_DEFAULT。要传递给的其他参数回调后可以指定回调。可以将空闲优先级指定为关键字“priority”的关键字 - 值对。

一个问题:如果你想让它们保留在调度程序中,你的回调就会返回True,否则只会执行一次。

HTH!

答案 1 :(得分:2)

免责声明:我没有任何使用pygtk的经验。

我想要做到这一点,你必须让GTK事件循环调用你的代码(你的递归调用使得控件永远不会返回到事件循环)。

您可能有两种选择:

  • 设置一个计时器事件,每隔nnn毫秒调用一次方法(tutorial
  • 或者在GTK程序闲置时使用某种空闲事件来调用您的方法(tutorial

答案 2 :(得分:1)

由于您使用的是gtk,因此可以使用gio模块为您进行监控,而不是使用自己的自定义解决方案来定期轮询文件状态:

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

请注意,您可以将changed信号连接到回调,以执行所需的任何更新。