0

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と、同じコマンドが再び表示されますが、他の文字を押すと、前のステップのコマンドが消えます。ウィジェットから。なぜ私がこの種の行動を観察しているのか説明してください。

4

1 に答える 1

1

テキスト ウィジェットのデフォルトの動作では、選択したテキストが挿入されたテキストに置き換えられます。何が起こっているかというと、最初に他のテキストの選択を解除せずに、選択したテキストを変更し続けるため、文字を入力すると、SEL タグを持つ最初の文字から SEL タグを持つ最後の文字まですべてが削除されます。

簡単な解決策は、新しいテキスト範囲に追加する前に SEL タグをクリアすることです。

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

ユーザーがリターン キーを押したときに削除することもできます。

于 2013-09-17T11:09:06.767 に答える