Tkinter“自动完成”条目widg的问题

2024-10-06 07:06:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在寻找一种方法来添加自动完成到一个tkinterttk.条目小装置。我还偶然发现了一个建议this solution的网站。读了罗布的答案,我能够使它正常工作,无论什么情况。但是对于我想要的那种用法(在从以前的记录中自动完成的同时向SQLite数据库添加一个新项),按键也有一些奇怪的地方。我尝试的代码的第一个版本(来自this link,作者是IanWeisser)将在用户每次按下时删除一个字符。StackOverflow上的这个版本删除了捕捉<Backspace>, <Left>, <Right>, <Up>, <Down>击键的代码行,但我认为在键入时,如果用户按左键,自动完成应该被暂停,删除光标位置后选定的文本。在

那么,我们如何更改代码,以便用户可以正常输入文本,并返回几个字符来更正任何拼写错误,而不删除文本呢?在


Tags: 方法答案代码用户文本版本网站情况
1条回答
网友
1楼 · 发布于 2024-10-06 07:06:41

我根据这两个来源编辑了代码,对我来说,我认为这样做更好:

    def handle_keyrelease(self, event):
    """event handler for the keyrelease event on this widget"""
    if event.keysym == "BackSpace":
        if self.position < self.index(END): # delete the selection
            self.delete(self.position, END)
        else:
            #self.delete(self.index(INSERT), END) 
            self.position = self.index(END)
    if event.keysym == "Left":
        if self.position < self.index(END): # delete the selection
            self.delete(self.position, END)
        #else:
            #self.position = self.position-1 # delete one character
            #self.delete(self.position, END)
    if event.keysym == "Right":
        self.position = self.index(END) # go to end (no selection)
    if event.keysym == "Down":
        self.autocomplete(1) # cycle to next hit
    if event.keysym == "Up":
        self.autocomplete(-1) # cycle to previous hit
    # perform normal autocomplete if event is a single key or an umlaut
    if len(event.keysym) == 1:
        self.autocomplete()

基本上,这是伊恩·韦瑟的版本。{I在“允许用户返回”中添加了一个“^并允许用户返回”中添加了一个“^键来更正”中的错误。现在,如果用户返回并编辑某个内容,则先前输入的文本的其余部分将保持不变,并且只有在用户按下(只删除剩余的自动完成功能,而其余部分保持不变)或退格键(按预期一次删除自动完成和一个字符)时,文本才会被删除。如果用户鼠标单击文本,则不会删除任何内容。在

相关问题 更多 >