簡體   English   中英

PyGTK:篩選鍵盤輸入到Entry小部件時,在打開大緩沖區時無法正確設置光標位置

[英]PyGTK: When filtering keyboard input to an Entry widget, can't correctly set the cursor position while opening a large buffer

我正在用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無效。

終於找到答案-更改通話

gobject.idle_add(entry.set_position, newPos)

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

由於entry.set_position返回None,它將立即執行一次,然后再執行一次即可,完全按照我的要求進行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM