我正在开展一个手势识别项目。有一个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()
函数的任何事件,每次触发该事件时都可以检查文件更新...
任何帮助将不胜感激。
答案 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事件循环调用你的代码(你的递归调用使得控件永远不会返回到事件循环)。
您可能有两种选择:
答案 2 :(得分:1)
由于您使用的是gtk
,因此可以使用gio
模块为您进行监控,而不是使用自己的自定义解决方案来定期轮询文件状态:
monitor = gio.File(filename).monitor()
monitor.connect('changed', file_changed_cb)
请注意,您可以将changed
信号连接到回调,以执行所需的任何更新。