Python 2.7 ata.append(项目) #更新列表框中的数据 列表框_更新(数据) def列表框_更新(数据): #删除以前的数据 listbox.delete(0,“结束”) #排序数据 数据=已排序(数据,键=str.lower) #输入新数据 对于数据中的项目

Python 2.7 ata.append(项目) #更新列表框中的数据 列表框_更新(数据) def列表框_更新(数据): #删除以前的数据 listbox.delete(0,“结束”) #排序数据 数据=已排序(数据,键=str.lower) #输入新数据 对于数据中的项目,python-2.7,tkinter,combobox,sqlite,tk,Python 2.7,Tkinter,Combobox,Sqlite,Tk,ata.append(项目) #更新列表框中的数据 列表框_更新(数据) def列表框_更新(数据): #删除以前的数据 listbox.delete(0,“结束”) #排序数据 数据=已排序(数据,键=str.lower) #输入新数据 对于数据中的项目: listbox.insert('结束',项) def on_选择(事件): #显示列表中选定的元素 打印('(事件)上一个:',event.widget.get('active')) 打印(“(事件)当前:”,event.widget.ge

ata.append(项目) #更新列表框中的数据 列表框_更新(数据) def列表框_更新(数据): #删除以前的数据 listbox.delete(0,“结束”) #排序数据 数据=已排序(数据,键=str.lower) #输入新数据 对于数据中的项目: listbox.insert('结束',项) def on_选择(事件): #显示列表中选定的元素 打印('(事件)上一个:',event.widget.get('active')) 打印(“(事件)当前:”,event.widget.get(event.widget.curselection()) 打印('--') #---梅因--- 测试列表=(‘苹果’、‘香蕉’、‘蔓越莓’、‘山茱萸’、‘阿尔法’、‘橡子’、‘茴香’、‘草莓’) root=tk.tk() var_text=tk.StringVar() var_text.trace('w',on_change) entry=tk.entry(根,textvariable=var\u text) entry.pack() listbox=tk.listbox(根) listbox.pack() #listbox.bind(“”,on_select) listbox.bind(“”,on_select) 列表框更新(测试列表) root.mainloop()
请使用包含示例数据的iow,不要使用我们无法使用的SQLite调用。@抱歉,我已经做了几次编辑,您现在也可以运行代码了。您对用户体验有何看法?你不能在用户输入之前和之后选择文本。这是很有可能的,作为最终用户,我在另一个产品中使用了相同的功能,并尝试复制相同的功能。假设库存中有100种浆果,需要选择一种,我所需要做的就是键入“berry”并滚动100种浆果,然后选择我想要的浆果。请注意,当我不断键入时,下拉列表中的“b”、“be”、“ber”、“berr”、“berry”的结果子集将越来越小。您不能在“蔓越莓”中使用
如果“berry”
如果“草莓”中的“berry”
)吗。在您的代码中,它将是
元素中的if self.get().lower()
我尝试在元素中使用
if self.get().lower().lower():
正如您所说,响应将自动填充最接近的匹配项,随后使用向上/向下箭头滚动可能会也可能不会获取预期值。我不知道如何使用
string.find()
,为了更好地自我解释,我在原始问题中添加了实际功能的屏幕截图。command
“Cranberry”。find(“be”)
给出了
“Cranberry”中
“be”的位置
当您键入文本时,您将知道要突出显示哪个部分以及将光标放在哪里。嗯,我尝试将其合并到现有程序中,但不确定如何执行。我对python比较陌生。然而,我确实在Python shell上运行了它,看到它以数字值的形式返回文本的位置,如下所示:
>>“Cranberry.find”(“be”)4>>“Cranberry.find”(“b”)4
我不确定如何进一步处理这个数字值,所以看起来我将不得不使用
元素.lower().startswith
暂时。坦白地说,如果您只使用
Entry
来输入文本,而使用
Listbox
来显示匹配的元素,而不使用所有这些自动完成和突出显示功能,这会更容易。@mbadullah我想使用按键的原因是为了避免等待按键释放时出现延迟的感觉。通过将上述解决方案与以下方法相结合,我能够对stringvar的更改运行该操作
import Tkinter
import ttk
import sqlite3


class AutocompleteCombobox(ttk.Combobox):

        def set_completion_list(self, completion_list):
                """Use our completion list as our drop down selection menu, arrows move through menu."""
                self._completion_list = sorted(completion_list, key=str.lower) # Work with a sorted list
                self._hits = []
                self._hit_index = 0
                self.position = 0
                self.bind('<KeyRelease>', self.handle_keyrelease)
                self['values'] = self._completion_list  # Setup our popup menu

        def autocomplete(self, delta=0):
                """autocomplete the Combobox, delta may be 0/1/-1 to cycle through possible hits"""
                if delta: # need to delete selection otherwise we would fix the current position
                        self.delete(self.position, Tkinter.END)
                else: # set position to end so selection starts where textentry ended
                        self.position = len(self.get())
                # collect hits
                _hits = []
                for element in self._completion_list:
                        if element.lower().startswith(self.get().lower()): # Match case insensitively
                                _hits.append(element)
                # if we have a new hit list, keep this in mind
                if _hits != self._hits:
                        self._hit_index = 0
                        self._hits=_hits
                # only allow cycling if we are in a known hit list
                if _hits == self._hits and self._hits:
                        self._hit_index = (self._hit_index + delta) % len(self._hits)
                # now finally perform the auto completion
                if self._hits:
                        self.delete(0,Tkinter.END)
                        self.insert(0,self._hits[self._hit_index])
                        self.select_range(self.position,Tkinter.END)

        def handle_keyrelease(self, event):
                """event handler for the keyrelease event on this widget"""
                if event.keysym == "BackSpace":
                        self.delete(self.index(Tkinter.INSERT), Tkinter.END)
                        self.position = self.index(Tkinter.END)
                if event.keysym == "Left":
                        if self.position < self.index(Tkinter.END): # delete the selection
                                self.delete(self.position, Tkinter.END)
                        else:
                                self.position = self.position-1 # delete one character
                                self.delete(self.position, Tkinter.END)
                if event.keysym == "Right":
                        self.position = self.index(Tkinter.END) # go to end (no selection)
                if len(event.keysym) == 1:
                        self.autocomplete()
                # No need for up/down, we'll jump to the popup
                # list at the position of the autocompletion


def test(test_list):
        """Run a mini application to test the AutocompleteEntry Widget."""
        root = Tkinter.Tk(className='AutocompleteCombobox')

        combo = AutocompleteCombobox(root)
        combo.set_completion_list(test_list)
        combo.pack()
        combo.focus_set()
        # I used a tiling WM with no controls, added a shortcut to quit
        root.bind('<Control-Q>', lambda event=None: root.destroy())
        root.bind('<Control-q>', lambda event=None: root.destroy())
        root.mainloop()

if __name__ == '__main__':
        test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )
        test(test_list)
 if self.get().lower() in element.lower():
 if element.lower().startswith(self.get().lower()):
#!/usr/bin/env python3

import tkinter as tk

def on_keyrelease(event):
    
    # get text from entry
    value = event.widget.get()
    value = value.strip().lower()
    
    # get data from test_list
    if value == '':
        data = test_list
    else:
        data = []
        for item in test_list:
            if value in item.lower():
                data.append(item)                

    # update data in listbox
    listbox_update(data)
    
    
def listbox_update(data):
    # delete previous data
    listbox.delete(0, 'end')
    
    # sorting data 
    data = sorted(data, key=str.lower)

    # put new data
    for item in data:
        listbox.insert('end', item)


def on_select(event):
    # display element selected on list
    print('(event) previous:', event.widget.get('active'))
    print('(event)  current:', event.widget.get(event.widget.curselection()))
    print('---')


# --- main ---

test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )

root = tk.Tk()

entry = tk.Entry(root)
entry.pack()
entry.bind('<KeyRelease>', on_keyrelease)

listbox = tk.Listbox(root)
listbox.pack()
#listbox.bind('<Double-Button-1>', on_select)
listbox.bind('<<ListboxSelect>>', on_select)
listbox_update(test_list)

root.mainloop()
if event.keysym == 'BackSpace':
    value = event.widget.get()[:-1]  # remove last char
else:
    value = event.widget.get() + event.char  # add new char at the end
#!/usr/bin/env python3

import tkinter as tk

def on_keypress(event):

    print(event)
    print(event.state & 4) # Control
    print(event.keysym == 'a')
    # get text from entry
    if event.keysym == 'BackSpace':
        # remove last char
        value = event.widget.get()[:-1]
    elif (event.state & 4): # and (event.keysym in ('a', 'c', 'x', 'e')):
        value = event.widget.get()
    else:
        # add new char at the end        
        value = event.widget.get() + event.char
    #TODO: other special keys

    value = value.strip().lower()

    # get data from test_list
    if value == '':
        data = test_list
    else:
        data = []
        for item in test_list:
            if value in item.lower():
                data.append(item)                

    # update data in listbox
    listbox_update(data)


def listbox_update(data):
    # delete previous data
    listbox.delete(0, 'end')

    # sorting data 
    data = sorted(data, key=str.lower)

    # put new data
    for item in data:
        listbox.insert('end', item)


def on_select(event):
    # display element selected on list
    print('(event) previous:', event.widget.get('active'))
    print('(event)  current:', event.widget.get(event.widget.curselection()))
    print('---')


# --- main ---

test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )

root = tk.Tk()

entry = tk.Entry(root)
entry.pack()
entry.bind('<KeyPress>', on_keypress)

listbox = tk.Listbox(root)
listbox.pack()
#listbox.bind('<Double-Button-1>', on_select)
listbox.bind('<<ListboxSelect>>', on_select)
listbox_update(test_list)

root.mainloop()
var_text = tk.StringVar()
var_text.trace('w', on_change)

entry = tk.Entry(root, textvariable=var_text)
entry.pack()
#!/usr/bin/env python3

import tkinter as tk

def on_change(*args):
    #print(args)
          
    value = var_text.get()
    value = value.strip().lower()

    # get data from test_list
    if value == '':
        data = test_list
    else:
        data = []
        for item in test_list:
            if value in item.lower():
                data.append(item)                

    # update data in listbox
    listbox_update(data)


def listbox_update(data):
    # delete previous data
    listbox.delete(0, 'end')

    # sorting data 
    data = sorted(data, key=str.lower)

    # put new data
    for item in data:
        listbox.insert('end', item)


def on_select(event):
    # display element selected on list
    print('(event) previous:', event.widget.get('active'))
    print('(event)  current:', event.widget.get(event.widget.curselection()))
    print('---')

# --- main ---

test_list = ('apple', 'banana', 'Cranberry', 'dogwood', 'alpha', 'Acorn', 'Anise', 'Strawberry' )

root = tk.Tk()

var_text = tk.StringVar()
var_text.trace('w', on_change)

entry = tk.Entry(root, textvariable=var_text)
entry.pack()

listbox = tk.Listbox(root)
listbox.pack()
#listbox.bind('<Double-Button-1>', on_select)
listbox.bind('<<ListboxSelect>>', on_select)
listbox_update(test_list)

root.mainloop()