python - PyGTK:过滤输入小部件的键盘输入时,在打开大缓冲区时无法正确设置光标位置

标签 python pygtk

我正在使用 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/

相关文章:

python - ConvergenceWarning : Liblinear failed to converge, 增加迭代次数

python - 如何实现 glob.glob

python - python gtk.Entry 中的 "preedit-changed"事件不起作用

python - 防止 PyGTK 按钮在标签更改时调整大小

python - 在滚动窗口内放置绘图区域时防止滚动条出现

python - Matplotlib zorder ax 隐藏其他轴的线

python - 从字符串列表中,如何获得 python 中最奇怪的单词/字符串

python - NetworkX - 生成随机连接的二分图

python - Keras 中的 "Could not interpret optimizer identifier"错误

python - 将 Counter() 列表附加到 pygtk 树存储 (Python)