Python Forum
performs the search without pressing enter or a key - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: performs the search without pressing enter or a key (/thread-29769.html)



performs the search without pressing enter or a key - forumpy - Sep-19-2020

i need help, I want to create a python search engine that will search for clients' names (from a sqlite3 database and display them on the Treeview object),search automatically without clicking on search Button (i.e. in real time). The code below allows a good search but the problem is that it doesn't take into account the last letter typed. example if I write in the search field 'Nam' it executes the search for 'Na' just if I write in the search field 'Name' it performs the search for 'Nam' just (i.e. either press enter or a key so that it performs the search)

 def SearchByName(event):
    for x in Tree.get_children():
        Tree.delete(x)
    Name = entrySearchByName.get()
    conn = sqlite3.connect('database.db')
    cur = conn.cursor()
    SQL = "SELECT*FROM customers where Name LIKE ?"
    Wc_Name = "%{}%".format(Name)
    select = cur.execute(SQL, (Wc_Name,))
    select =list(select)
    conn.commit()
    for row in select:
        Tree.insert('', END, values = row)
        conn.close()
 
lbSearchByName = Label(root, text="Search By Name :", font=("Times New Roman",18))
lbSearchByName.place(x=540, y=2)
entrySearchByName = Entry(root)
entrySearchByName.place(x=730, y=7, width=250, height=25)
entrySearchByName.bind("<Key>", SearchByName)



RE: performs the search without pressing enter or a key - deanhystad - Sep-19-2020

Maybe bind to Return instead of Key?


RE: performs the search without pressing enter or a key - forumpy - Sep-22-2020

how can i use after() function to call the function with a slight delay
the insertion will have been handled, and entrySearchByName.get()
will return the full contents.


I want to create a Python search engine that will search for clients' names (from a sqlite3 database and display them on the Treeview object), search automatically without clicking on search Button (i.e. in real time). The code below allows a good search, but the problem is that it doesn't take into account the last letter typed.

example:

if I write in the search field 'Nam' it executes the search for 'Na' only. If I write in the search field 'Name' it performs the search for 'Nam' only (i.e. either press enter or a key so that it performs the search)

 def SearchByName(event):
    for x in Tree.get_children():
        Tree.delete(x)
    Name = entrySearchByName.get()
    conn = sqlite3.connect('database.db')
    cur = conn.cursor()
    SQL = "SELECT*FROM customers where Name LIKE ?"
    Wc_Name = "%{}%".format(Name)
    select = cur.execute(SQL, (Wc_Name,))
    select =list(select)
    conn.commit()
    for row in select:
        Tree.insert('', END, values = row)
        conn.close()
 
lbSearchByName = Label(root, text="Search By Name :", font=("Times New Roman",18))
lbSearchByName.place(x=540, y=2)
entrySearchByName = Entry(root)
entrySearchByName.place(x=730, y=7, width=250, height=25)
entrySearchByName.bind("<Key>", SearchByName) 



RE: performs the search without pressing enter or a key - deanhystad - Sep-22-2020

I misunderstood your OP and thought you wanted to wait until all text was entered before starting search. Instead you want to search all the text that is in the entry field.

As you have discovered, this is difficult to do binding to the key event. The key event is really meant to be used to intercept a key press before it is processed. You want to call something after the key press is processed. To do that I suggest you use "trace".
from tkinter import *

def search(var, index,  mode):
    label_text.set(entry_text.get())

root = Tk()
root.geometry('220x80')

label_text = StringVar()
label = Label(root, textvar=label_text)
label.place(x=10, y=10, width=200)

entry_text = StringVar()
entry_text.trace_add('write', search)
entry = Entry(root, textvar = entry_text)
entry.place(x=10, y=50, width=200)
In this example the search() function is called when the "entry_text" variable is written. This happens after the key press event and after the latest key is added to the entry text.