0

I have the following code:


import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

from FUNCTIONS import unique_languages, unique_systems, unique_products, unique_business

from FUNCTIONS import product_summary, product_match, system_summary, system_match, language_summary, business_summary, \
    business_match


class App(tk.Tk):
    """Application start here"""

    def __init__(self):
        super().__init__()

        self.protocol("WM_DELETE_WINDOW", self.on_close)
        self.title("Simple App")

        self.option = tk.IntVar()
        self.departments = ('product_summary', 'product_match',
                            'system_summary', 'system_match',
                            'business_summary', 'business_match',
                            'language_summary')
        self.df_MA_1 = unique_products
        self.df_MA_2 = unique_products
        self.df_MA_3 = unique_systems
        self.df_MA_4 = unique_systems
        self.df_MA_5 = unique_business
        self.df_MA_6 = unique_business
        self.df_MA_7 = unique_languages

        self.init_ui()
        self.on_reset()

    def init_ui(self):

        w = ttk.Frame(self, padding=8)

        r = 0
        c = 1
        ttk.Label(w, text="Combobox:").grid(row=r, sticky=tk.W)
        self.cbCombo = ttk.Combobox(w, values="")
        self.cbCombo.grid(row=r, column=c, padx=5, pady=5)

        r += 1
        ttk.Label(w, text="Radiobutton:").grid(row=r, sticky=tk.W)
        for index, text in enumerate(self.departments):
            ttk.Radiobutton(w,
                            text=text,
                            variable=self.option,
                            value=index,
                            command=self.set_combo_values).grid(row=r,
                                                                column=c,
                                                                sticky=tk.W,
                                                                padx=5, pady=5)
            r += 1

        r = 0
        c = 2

        b = ttk.LabelFrame(self, text="", relief=tk.GROOVE, padding=5)

        bts = [("Reset", 0, self.on_reset, "<Alt-r>"),
               ("Close", 0, self.on_close, "<Alt-c>")]

        for btn in bts:
            ttk.Button(b, text=btn[0], underline=btn[1], command=btn[2]).grid(row=r,
                                                                              column=c,
                                                                              sticky=tk.N + tk.W + tk.E,
                                                                              padx=5, pady=5)
            self.bind(btn[3], btn[2])
            r += 1

        b.grid(row=0, column=1, sticky=tk.N + tk.W + tk.S + tk.E)
        w.grid(row=0, column=0, sticky=tk.N + tk.W + tk.S + tk.E)

    def set_combo_values(self):

        print("you have selected {0} radio option".format(self.option.get()))

        self.cbCombo.set("")

        if self.option.get() == 0:
            self.cbCombo["values"] = self.df_MA_1
        elif self.option.get() == 1:
            self.cbCombo["values"] = self.df_MA_2
        elif self.option.get() == 2:
            self.cbCombo["values"] = self.df_MA_3
        elif self.option.get() == 3:
            self.cbCombo["values"] = self.df_MA_4
        elif self.option.get() == 4:
            self.cbCombo["values"] = self.df_MA_5
        elif self.option.get() == 5:
            self.cbCombo["values"] = self.df_MA_6
        elif self.option.get() == 6:
            self.cbCombo["values"] = self.df_MA_7

    def on_reset(self, evt=None):
        self.cbCombo.set("")
        self.option.set(0)
        self.set_combo_values()

    def on_close(self, evt=None):
        """Close all"""
        if messagebox.askokcancel(self.title(), "Do you want to quit?", parent=self):
            self.destroy()


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()


I need to implement the code inside the class https://stackoverflow.com/a/65821591/12759374 Exactly this function:


def check_input(event):
    value = event.widget.get()

    if value == '':
        combo_box['values'] = lst
    else:
        data = []
        for item in lst:
            if value.lower() in item.lower():
                data.append(item)

        combo_box['values'] = data

and this execution:


combo_box.bind('<KeyRelease>', check_input)

How to union these two solutions? So, I have 7 RadioButtons, dropdown lists based on selected RadioButtons, but I have 1 list where more than 300 elements, so I want to realize to search function inside given dropdown list.

luibrain
  • 63
  • 7
  • I assume, you would replace `combo_box` with `self.cbCombo`. You have not shown us an attempt where you try to combine these code. Also we cannot run your code as it uses other modules, so it will be better to provide something like an example that we will be able to run and is minimal. This said issue can be reproduced in less than 50 lines of code – Delrius Euphoria Aug 10 '22 at 10:39

1 Answers1

1

I did it, thank you!


import tkinter as tk
from tkinter import ttk
from tkinter import messagebox

from FUNCTIONS import unique_languages, unique_systems, unique_products, unique_business

from FUNCTIONS import product_summary, product_match, system_summary, system_match, language_summary, business_summary, \
    business_match


class App(tk.Tk):
    """Application start here"""

    def __init__(self):
        super().__init__()

        self.protocol("WM_DELETE_WINDOW", self.on_close)
        self.title("Simple App")

        self.option = tk.IntVar()
        self.departments = ('product_summary', 'product_match',
                            'system_summary', 'system_match',
                            'business_summary', 'business_match',
                            'language_summary')
        self.df_MA_1 = unique_products
        self.df_MA_2 = unique_products
        self.df_MA_3 = unique_systems
        self.df_MA_4 = unique_systems
        self.df_MA_5 = unique_business
        self.df_MA_6 = unique_business
        self.df_MA_7 = unique_languages

        self.init_ui()
        self.on_reset()

    def init_ui(self):

        w = ttk.Frame(self, padding=8)

        r = 0
        c = 1
        ttk.Label(w, text="Combobox:").grid(row=r, sticky=tk.W)
        self.cbCombo = ttk.Combobox(w, values="")
        self.cbCombo.grid(row=r, column=c, padx=5, pady=5)

        r += 1
        ttk.Label(w, text="Radiobutton:").grid(row=r, sticky=tk.W)
        for index, text in enumerate(self.departments):
            ttk.Radiobutton(w,
                            text=text,
                            variable=self.option,
                            value=index,
                            command=self.set_combo_values).grid(row=r,
                                                                column=c,
                                                                sticky=tk.W,
                                                                padx=5, pady=5)
            r += 1

        r = 0
        c = 2

        b = ttk.LabelFrame(self, text="", relief=tk.GROOVE, padding=5)

        bts = [("Reset", 0, self.on_reset, "<Alt-r>"),
               ("Close", 0, self.on_close, "<Alt-c>")]

        for btn in bts:
            ttk.Button(b, text=btn[0], underline=btn[1], command=btn[2]).grid(row=r,
                                                                              column=c,
                                                                              sticky=tk.N + tk.W + tk.E,
                                                                              padx=5, pady=5)
            self.bind(btn[3], btn[2])
            r += 1

        b.grid(row=0, column=1, sticky=tk.N + tk.W + tk.S + tk.E)
        w.grid(row=0, column=0, sticky=tk.N + tk.W + tk.S + tk.E)

        self.bind("<<ComboboxSelected>>", self.selection)
        self.bind('<KeyRelease>', self.check_input)

    def set_combo_values(self):

        print("you have selected {0} radio option".format(self.option.get()))

        self.cbCombo.set("")

        if self.option.get() == 0:
            self.cbCombo["values"] = self.df_MA_1
            self.chosen = self.df_MA_1
        elif self.option.get() == 1:
            self.cbCombo["values"] = self.df_MA_2
            self.chosen = self.df_MA_2
        elif self.option.get() == 2:
            self.cbCombo["values"] = self.df_MA_3
            self.chosen = self.df_MA_3
        elif self.option.get() == 3:
            self.cbCombo["values"] = self.df_MA_4
            self.chosen = self.df_MA_4
        elif self.option.get() == 4:
            self.cbCombo["values"] = self.df_MA_5
            self.chosen = self.df_MA_5
        elif self.option.get() == 5:
            self.cbCombo["values"] = self.df_MA_6
            self.chosen = self.df_MA_6
        elif self.option.get() == 6:
            self.cbCombo["values"] = self.df_MA_7
            self.chosen = self.df_MA_7

    def on_reset(self, evt=None):
        self.cbCombo.set("")
        self.option.set(0)
        self.set_combo_values()

    def on_close(self, evt=None):
        """Close all"""
        if messagebox.askokcancel(self.title(), "Do you want to quit?", parent=self):
            self.destroy()

    def selection(self, event):
        self.var_Selected = self.cbCombo.get()
        print(self.var_Selected)

    def check_input(self, event):
        value = event.widget.get()

        if value == '':
            self.cbCombo['values'] = self.chosen
        else:
            data = []
            for item in self.chosen:
                if value.lower() in item.lower():
                    data.append(item)

            self.cbCombo['values'] = data


def main():
    app = App()
    app.mainloop()


if __name__ == '__main__':
    main()


The keys are:


self.bind('<KeyRelease>', self.check_input)


self.chosen


    def check_input(self, event):
        value = event.widget.get()

        if value == '':
            self.cbCombo['values'] = self.chosen
        else:
            data = []
            for item in self.chosen:
                if value.lower() in item.lower():
                    data.append(item)

            self.cbCombo['values'] = data

luibrain
  • 63
  • 7