[Tutor] Getting current listbox item index and bind it to button (Tkinter)

Ali M adeadmarshal at gmail.com
Mon Aug 6 15:50:32 EDT 2018


If i delete this line "self.textbox.delete(1.0, tk.END)" in my
enter_meaning function the listbox items won't lower down to 1 item and i
just want 1 item to be shown after user searches the item in entrybox.
what i want to do is: when user searches in entrybox, the listbox items
lowers down to that searched item only, and when i click on that 1
remaining item, the results from db prints in text widget, i want to be
able to also use the button to print it. how can i configure the button for
this? i hope i explained clearly.

import sqlite3 as sqlite
import tkinter as tk
from tkinter import ttk


# GUI Widgets

class EsperantoDict:
    def __init__(self, master):

        master.title("EsperantoDict")
        master.iconbitmap("Esperanto.ico")
        master.resizable(False, False)
        master.configure(background='#EAFFCD')
        self.style = ttk.Style()
        self.search_var = tk.StringVar()
        self.search_var.trace("w", lambda name, index, mode:
self.update_list())

        self.style = ttk.Style()
        self.style.configure("TFrame", background='#EAFFCD')
        self.style.configure("TButton", background='#C6FF02')
        self.style.configure("TLabel", background='#EAFFCD')

        self.frame_header = ttk.Frame(master, relief=tk.FLAT)
        self.frame_header.config(style="TFrame")
        self.frame_header.pack(side=tk.TOP, padx=5, pady=5)

        self.logo = tk.PhotoImage(file=r'C:\EsperantoDict\eo.png')
        self.small_logo = self.logo.subsample(10, 10)

        ttk.Label(self.frame_header, image=self.small_logo).grid(row=0,
column=0, stick="ne", padx=5, pady=5, rowspan=2)
        ttk.Label(self.frame_header, text='EsperantoDict', font=('Arial',
18, 'bold')).grid(row=0, column=1)

        self.frame_content = ttk.Frame(master)
        self.frame_content.config(style="TFrame")
        self.frame_content.pack()

        self.entry_search = ttk.Entry(self.frame_content,
textvariable=self.search_var, width=30)
        self.entry_search.bind('<FocusIn>', self.entry_delete)
        self.entry_search.bind('<FocusOut>', self.entry_insert)
        self.entry_search.grid(row=0, column=0, padx=5)
        self.entry_search.focus()
        self.entry_search.bind("<KeyRelease>", self.edit_input)

        self.button_search = ttk.Button(self.frame_content, text=u"Serĉu")
        self.photo_search =
tk.PhotoImage(file=r'C:\EsperantoDict\search.png')
        self.small_photo_search = self.photo_search.subsample(3, 3)
        self.button_search.config(image=self.small_photo_search,
compound=tk.LEFT, style="TButton")
        self.button_search.grid(row=0, column=2, columnspan=1, sticky='nw',
padx=5)
        self.button_search.bind('<Return>', self.search_word)

        self.listbox = tk.Listbox(self.frame_content, height=30, width=30)
        self.listbox.grid(row=1, column=0, padx=5)
        self.scrollbar = ttk.Scrollbar(self.frame_content,
orient=tk.VERTICAL, command=self.listbox.yview)
        self.scrollbar.grid(row=1, column=1, sticky='nsw')
        self.listbox.config(yscrollcommand=self.scrollbar.set)
        self.listbox.bind('<<ListboxSelect>>', self.enter_meaning)

        self.textbox = tk.Text(self.frame_content, relief=tk.GROOVE,
width=60, height=30, borderwidth=2)
        self.textbox.config(wrap='word')
        self.textbox.grid(row=1, column=2, sticky='w', padx=5)

        # SQLite
        self.db = sqlite.connect(r'C:\EsperantoDict\test.db')
        self.cur = self.db.cursor()
        self.cur.execute("SELECT Esperanto FROM Words ORDER BY Esperanto")
        for row in self.cur:
            self.listbox.insert(tk.END, row)
            self.update_list()

    def update_list(self):
        self.listbox.delete(0, tk.END)
        search_term = self.search_var.get().lower()
        if search_term == 'type to search':
            search_term = ''
        self.cur.execute("SELECT Esperanto FROM Words WHERE
LOWER(Esperanto) LIKE ? ORDER BY Esperanto",
                         ('%' + search_term + '%',))
        for row in self.cur:
            item = row[0]
            self.listbox.insert(tk.END, item)
        for row in range(0, self.listbox.size(), 2):
            self.listbox.itemconfigure(row, background="#f0f0ff")

    def edit_input(self, tag):
        word_to_esp = {'gx': 'ĝ', 'cx': 'ĉ', 'hx': 'ĥ', 'jx': 'ĵ', 'ux':
'ŭ', 'sx': 'ŝ'}
        user_input = self.entry_search.get()
        user_input = user_input.lower()
        for i in word_to_esp:
            if user_input.__contains__(i):
                a = user_input.replace(i, word_to_esp[i])
                return self.search_var.set(a)

    # SQLite
    def enter_meaning(self, tag):
        for index in self.listbox.curselection():
            global esperanto
            global results
            esperanto = self.listbox.get(index)
            results = self.cur.execute("SELECT English FROM Words WHERE
Esperanto = ?", (esperanto,))
        for row in results:
            self.textbox.delete(1.0, tk.END)
            self.textbox.insert(tk.END, row[0])

    def entry_delete(self, tag):
        if self.entry_search.get():
            self.entry_search.delete(0, tk.END)
            self.textbox.delete(1.0, tk.END)
        return None

    def entry_insert(self, tag):
        if self.entry_search.get() == '':
            self.entry_search.insert(0, "Type to Search")
        return None

    def search_word(self, index):
        self.listbox.curselection()
        if self.search_var.get() == self.listbox.get(index):
            self.textbox.delete(1.0, tk.END)
        for row in results:
            self.textbox.insert(tk.END, row[0])


def main():
    root = tk.Tk()
    EsperantoDict(root)
    root.mainloop()


if __name__ == '__main__': main()

# db tbl name: Words
# db first field name: Esperanto
# db second field name: English


More information about the Tutor mailing list