我正在用PyGTK编写一个用于导航大型(> 20 MB)文本文件的程序。我正在使用TextViewer小部件,它可以很好地处理它们,除了完成相应的TextBuffer填充需要几秒钟。同时,我还有几个对话框需要过滤它们的输入(只有十六进制数字或其他东西)。我将要允许的字符和信号名称传递给此函数:
def FilterText(self, chars, signal):
def Filt(entry, text, length, position):
position = entry.get_position()
chrs = set(chars)
realtext = ''.join([c for c in text if c in chrs])
if len(realtext) > 0:
entry.handler_block_by_func(Filt)
entry.insert_text(realtext, position)
entry.handler_unblock_by_func(Filt)
newPos = position + len(realtext)
gobject.idle_add(entry.set_position, newPos)
entry.stop_emission(signal)
return Filt
然后将结果连接到Entry小部件的信号处理程序。这是有效的,除了填充TextBuffer时,排队的entry.set_position调用都不会运行直到完成。结果是光标停留在Entry的开头,所有键入的内容都是向后的,不用说,这很烦人。这可能是因为在填充TextBuffer之前没有空闲时间。有没有办法解决这个问题,并在键入已过滤的Entry小部件时允许正确的行为? (应该可以,因为未经过滤的问题不会遇到这样的问题)直接调用entry.set_position因某些原因不起作用。
答案 0 :(得分:1)
最后弄清楚了 - 改变了电话
gobject.idle_add(entry.set_position, newPos)
要
gobject.timeout_add(0, entry.set_position, newPos)
由于entry.set_position返回None,它会立即调用它一次,然后再也不会再调用它,完全按照我的意愿调用它。