1

我正在使用 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 不起作用。

4

1 回答 1

1

终于弄明白了——换个电话

gobject.idle_add(entry.set_position, newPos)

gobject.timeout_add(0, entry.set_position, newPos)

Since entry.set_position returns None, it will call it once immediately, then never again, doing exactly what I wanted.

于 2012-09-17T20:06:43.107 回答