I have this list box

#######################################################################

import tkinter
from TkTreectrl import *

# define some data to insert into the list:
data = {
    'Joe':      1000.00,
    'Jill':     738.39,
    'Jack':     625.11,
    'Jane':     99.99
}


root = tkinter.Tk()
# create list with scrollbars
slistbox = ScrolledMultiListbox(root)
slistbox.pack(fill='both', expand=1)
listbox = slistbox.listbox
# create columns
listbox.configure(columns=('Paid', 'Customer', 'Debt'))

#### add checkbox support to the listbox ####
# checkbox icons:
checked = tkinter.PhotoImage(data=(r'R0lGODlhDQANABEAACwAAAAADQANAIEAAAB/f3/f3'
    '9////8CJ4yPNgHtLxYYtNbIbJ146jZ0gzeCIuhQ53NJVNpmryZqsYDnemT3BQA7'))
unchecked = tkinter.PhotoImage(data='R0lGODlhDQANABEAACwAAAAADQANAIEAAAB/f3'
    '/f39////8CIYyPNgHtLxYYtNbIrMZTX+l9WThwZAmSppqGmADHcnRaBQA7')

# create treectrl state, element and style for the checkboxes:
listbox.state_define('Checked')
imgCheck = listbox.element_create(
            type='image', image=(checked, 'Checked', unchecked, ()))

icon_style = listbox.style_create()
listbox.style_elements(icon_style,
            listbox.element('select'), listbox.element('text'),imgCheck)
listbox.style_layout(icon_style, imgCheck, padx=3, pady=2)
listbox.style(0, icon_style)


# define checkbox callback that will be bound to mouse-button-1 events:
def cmd(event):
    # check which element was clicked
    identify = listbox.identify(event.x, event.y)
    # identify might be None or look like:
    # ('item', '2', 'column', '0') or
    # ('item', '3', 'column', '0', 'elem', 'pyelement3')
    if identify:
        try:
            item, column, element = identify[1], identify[3], identify[5]
            if element == imgCheck:
                # toggle the "checked" state
                listbox.itemstate_forcolumn(item, column, '~Checked')
                # do something, dependent on the current state of the checkbox
                new = listbox.itemstate_forcolumn(item, column)
                if new and 'Checked' in new:
                    # the checkbox was newly checked
                    print('Checked item', item, 'in column', column)
                    # example: debts are paid, set "Debt" to 0.00
                    listbox.itemelement_configure(item, listbox.column(2),
                                    listbox.element('text'), text='0.00')
                else:
                    # example: no payment received, set debt to stored value
                    print('Unchecked item', item, 'in column', column)
                    customer = listbox.itemelement_cget(
                                    item, listbox.column(1),
                                    listbox.element('text'), 'text')
                    debt = data[customer]
                    listbox.itemelement_configure(item, listbox.column(2),
                                    listbox.element('text'), text=debt)
        except IndexError:
            # we did not hit the checkbox, never mind
            pass

# bind the callback to button 1 events
listbox.bind('<1>', cmd)

# insert data into the list to see if this works:
for customer in data:
    listbox.insert('end', '', customer, data[customer])


root.mainloop()

###############################################################################

And I want to use this search box function in this list box

###########################################################################333

from tkinter import *


# First create application class


class Application(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)

        self.pack()
        self.create_widgets()

    # Create main GUI window
    def create_widgets(self):
        self.search_var = StringVar()
        self.search_var.trace("w", lambda name, index, mode: self.update_list())
        self.entry = Entry(self, textvariable=self.search_var, width=13)
        self.lbox = Listbox(self, width=45, height=15)

        self.entry.grid(row=0, column=0, padx=10, pady=3)
        self.lbox.grid(row=1, column=0, padx=10, pady=3)

        # Function for updating the list/doing the search.
        # It needs to be called here to populate the listbox.
        self.update_list()

    def update_list(self):
        search_term = self.search_var.get()

        # Just a generic list to populate the listbox
        lbox_list = ['Adam', 'Lucy', 'Barry', 'Bob',
                     'James', 'Frank', 'Susan', 'Amanda', 'Christie']

        self.lbox.delete(0, END)

        for item in lbox_list:
            if search_term.lower() in item.lower():
                self.lbox.insert(END, item)


root = Tk()
root.title('Filter Listbox Test')
app = Application(master=root)
print('Starting mainloop()')
app.mainloop()

#####################################################################
_______________________________________________
Tkinter-discuss mailing list
Tkinter-discuss@python.org
https://mail.python.org/mailman/listinfo/tkinter-discuss

Reply via email to