我正在使用 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 调用都不会运行,直到完成为止。结果是光标卡在条目的开头,并且输入的所有内容都是向后的,不用说,这非常烦人。这可能是因为在 TextBuffer 被填满之前没有空闲时间。有没有什么方法可以解决这个问题,并在输入过滤的条目小部件时允许正确的行为? (应该是可能的,因为未过滤的情况下不会遇到这样的问题)由于某种原因直接调用entry.set_position不起作用。
最佳答案
终于想通了——改变调用方式
gobject.idle_add(entry.set_position, newPos)
至
gobject.timeout_add(0, entry.set_position, newPos)
由于entry.set_position返回None,它会立即调用它一次,然后就不再调用它,完全按照我想要的方式进行。
关于python - PyGTK:过滤输入小部件的键盘输入时,在打开大缓冲区时无法正确设置光标位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11421376/