I am working on the auto suggestion list box the logic is good

Viewed 15

I am working on the project the application is working fine but small issue with list box, I created a class where we can call get suggestion from the entry data a sample code is given below

from tkinter import *

root = Tk()
root.geometry('300x300')
search = StringVar()
search1 = StringVar()

search_list = ["Apple", "Ball", "cat", "dog"]

Label(root, text="Search :").pack(pady=15)

search1_ent = Entry(root, textvariable=search)
search1_ent.pack(pady=15)

search2_ent = Entry(root, textvariable=search1)
search2_ent.pack(pady=15)

list_box = Listbox(root, height=10, width=20)

EntryList.EntryBoxListLink(search_list, list_box, search1_ent, search, 90, 87, 20)
root.mainloop()

I created a py file on the name Entry list in that created a class Entry box list link, It may not be perfect code but worked fine.

the class code is

import contextlib
from tkinter import *


class EntryBoxListLink:
    """this class is created to link entry box and the listbox"""

    def __init__(self, list_data='', list_box='', entry_box=None, set_variable='', x_axis=38, y_axis=52, width=20,
                 next_entry=None):

        self.list_data = list_data
        self.list_box = list_box
        self.entry_box = entry_box
        self.set_variable = set_variable
        self.x_axis = x_axis
        self.y_axis = y_axis
        self.width = width

        def destroyListBox(event):
            """this is the command when the list box to place forget"""
            with contextlib.suppress(BaseException):
                self.list_box.place_forget()

        def searchIList(event):
            """this gives the list box where the data no are aligned"""
            self.list_box.config(width=self.width)
            self.list_box.place(x=self.x_axis, y=self.y_axis)
            self.list_box.bind('<Leave>', destroyListBox)
            self.list_box.bind('<Double-1>', itemsSelected)
            self.list_box.bind('<Return>', itemsSelected)
            if self.list_data is not None:
                match = [i for i in self.list_data if
                         (self.set_variable.get().lower() or self.set_variable.get().capitalize()) in i]

                self.list_box.delete(0, END)
                for c in match:
                    try:
                        self.list_box.insert(END, c.title())
                    except BaseException:
                        self.list_box.insert(END, c)
                if not match:
                    destroyListBox(None)
            if self.set_variable.get() == "":
                destroyListBox(None)

        def itemsSelected(event):
            """when the no is selected from list box it aligned to
            the phone number and gives the data"""
            for i in self.list_box.curselection():
                self.set_variable.set(self.list_box.get(i))
                self.entry_box.focus_set()
                destroyListBox(None)
            if next_entry is not None:
                next_entry.focus()

        def set_entry_focus(event):
            if list_box.curselection()[0] == 0:
                return self.entry_box.focus_set()

        def focusAndSelect():
            self.list_box.focus_set()
            self.list_box.select_set(0)

        self.entry_box.bind("<KeyRelease>", searchIList)
        self.entry_box.bind("<Down>", lambda event: focusAndSelect())
        self.list_box.bind("<Up>", set_entry_focus)

the issue is when I select the second entry box the list box should be gone, to be more frank when the search1 and listbox are not in focus the list box should be place forget!

0 Answers
Related