在实现自动完成功能时,文本小部件数据被清除

时间:2013-09-17 09:51:28

标签: tkinter

我正在尝试使用Python Tkinter实现自动完成功能。我面临一个非常奇怪的问题 - 当我收到自动完整文本并尝试输入相同的文本时,窗口的整个内容都会消失。

from Tkinter import *

def getCommand(*args):
    global text
    x = text.get("MARK",END)
    text.insert(END,"\n")
    text.insert(END,"command>")
    text.mark_set("insert",END)
    text.mark_set("MARK",INSERT)
    text.mark_gravity("MARK",LEFT)
    text.see(END)
    return 'break'

validkeysymchars = []
validkeysymchars = validkeysymchars + map(chr, range(65,91))
validkeysymchars = validkeysymchars + map(chr, range(97,123))

def handle_keyrelease(event):
    global text
    if event.keysym in validkeysymchars:
        for x in ['testcommand']:
            strtocmp = text.get("MARK","end")
            strtocmp = strtocmp.encode('ascii','ignore')
            strtocmp = strtocmp.strip()
            if x.startswith(strtocmp):
                currpos = text.index(INSERT)
                text.insert(END,x[len(strtocmp):])
                text.tag_add(SEL,currpos,"%s+%dc"%(currpos,len(x)-len(strtocmp)))
                text.mark_set("insert",currpos)  

root = Tk()
text = Text(root)
text.pack()
text.insert(END,"command>")
text.mark_set("MARK",INSERT)
text.mark_gravity("MARK",LEFT)
text.focus()
text.bind("<Return>",getCommand)
text.bind("<KeyRelease>",handle_keyrelease)
root.mainloop()

因此,在此代码中,如果键入t,窗口小部件将显示testcommand作为自动完成命令,在点击返回键时,如果键入t,它将再次显示相同的命令但现在按下任何其他字符将导致上一步骤中的命令从小部件中消失。有人可以解释为什么我会观察这种行为。

1 个答案:

答案 0 :(得分:1)

文本小部件的默认行为是用插入的文本替换选定的文本。发生的事情是你不断更改所选文本而不首先取消选择任何其他文本,因此当你键入一个字母时,它会删除从第一个具有SEL标签的字符到具有SEL标签的最后一个字符的所有内容。

一个简单的解决方案是在将SEL标记添加到新的文本范围之前清除它:

...
text.tag_remove(SEL, "1.0", "end")
text.tag_add(SEL,currpos,"%s+%dc"%(currpos,len(x)-len(strtocmp)))
...

当用户按下返回键时,您可能还想删除它。