SYSTEM: You are a Python 3.12 programmer, capable of analyzing problems in depth and explaining solutions in a clear and concise manner. Your responses prioritize code efficiency, readability, and simplicity. You leverage the latest Python features. When addressing tasks, you break them down into clear steps and present only essential information, ensuring users receive focused, expert guidance tailored to their needs. You only print the parts of the code you changed in a way that makes them easy to copy paste in the code base. USER: Use the custom_tkinter_filter design for the filter in the header. It should use the header drobdown with All as default like in the code adn it should use the same filter options as currently in the code. Implement it fully and guide the user trough the implementation. Also delete functions that are not necessary anymore. after the implementation Custom Design: import tkinter as tk
from tkinter import ttk

def custom_tkinter_filter(master, headers=None, filter_types=None):
Create a Frame for the custom filter

filter_frame = ttk.Frame(master)
filter_frame.configure(style="Custom.TFrame")
Define style for the widgets

style = ttk.Style()
style.configure("Custom.TFrame", background="white", relief="flat", borderwidth=1)
style.configure("Custom.TCombobox", background="white")
Configure the widgets

header_combobox = ttk.Combobox(filter_frame, values=headers, style="Custom.TCombobox")
filtertype_combobox = ttk.Combobox(filter_frame, values=filter_types, style="Custom.TCombobox")
filter_entry = ttk.Entry(filter_frame)
Layout using grid

header_combobox.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
filtertype_combobox.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
filter_entry.grid(row=1, column=0, columnspan=2, padx=5, pady=5, sticky='ew')
Make the entry expand with the widget

filter_frame.columnconfigure(0, weight=1)
filter_frame.columnconfigure(1, weight=1)

return filter_frame

Create a simple application window to demonstrate the widget function

if name == "main":
root = tk.Tk()
headers = ["Column1", "Column2", "Column3"]
filter_types = ["Contains", "Equals", "Starts with"]

filter_widget = custom_tkinter_filter(root, headers, filter_types)
filter_widget.pack(padx=10, pady=10, fill='x')

root.mainloop() Python 3.12 Code: class TableApp:
    """Table Editor with sidebar and table management."""

    def __init__(self, root: tk.Tk):
        """Initialize the TableApp."""
        self.root = root
        self.config_dimensions()
        self.config_fonts()
        self.config_colors()
        self.initialize_data()
        self.setup_ui()
        self.load_tables()

    def config_dimensions(self):
        """Configure app dimensions."""
        self.root.title("Database")
        self.root.geometry("1920x1080")
        self.root.minsize(1435, 910)
        self.sidebar_width = 400
        self.spacer_frame_width = 100
        self.header_height = 190
        self.separator_height = 1

    def config_fonts(self):
        """Configure app fonts."""
        font_name, font_size, font_style = "Literata", 12, "normal"
        self.default_font = (font_name, font_size, font_style)
        self.root.option_add("*Font", f"{font_name} {font_size}")
        self.header_info_font = ("Literata", 10)

    def config_colors(self):
        """Configure app colors."""
        self.text_color = "#333333"
        self.background_color = "#FFFFFF"
        self.sidebar_color = "#F7F8FC"
        self.button_color = "#F7F8FC"
        self.button_color_selected = "#EAEDEF"
        self.separator_color = '#333333'
        self.header_info_font_color = '#999999'

    def setup_ui(self):
        """Set up the user interface with a 3x2 grid layout."""
        self.root.grid_rowconfigure(0, weight=0)
        self.root.grid_rowconfigure(1, weight=1)

        self.root.grid_columnconfigure(0, weight=0)
        self.root.grid_columnconfigure(1, weight=0, minsize=self.spacer_frame_width)
        self.root.grid_columnconfigure(2, weight=3)

        self.create_sidebar()
        self.create_header_frame()
        self.create_spacer_frame()
        self.create_table_frame() def create_header_frame(self) -> None:
"""Create the header divided into upper and lower sub-frames."""
header_frame = self._create_and_configure_header_frame()

upper_header_frame = self._create_upper_header(header_frame)
self._create_upper_header_content(upper_header_frame)

lower_header_frame = self._create_lower_header(header_frame)
self._create_filter_controls(lower_header_frame)

def _create_and_configure_header_frame(self) -> tk.Frame:
"""Create and configure the main header frame."""
header_frame = self._create_frame(parent=self.root, width=None, bg=self.background_color)
header_frame.grid(row=0, column=1, columnspan=2, sticky='ew')
header_frame.config(height=self.header_height)
header_frame.grid_propagate(False)

for i in range(2):
    header_frame.grid_rowconfigure(i, weight=0)

for i in range(5):
    weight = 1 if i == 4 else 0
    header_frame.grid_columnconfigure(i, weight=weight)

return header_frame

def _create_upper_header(self, parent: tk.Frame) -> tk.Frame:
"""Create the upper header frame."""
upper_header = self._create_frame(parent=parent, width=None, bg=self.background_color)
upper_header.grid(row=0, column=0, columnspan=5, sticky='ew', pady=(0, 10))
upper_header.grid_columnconfigure(5, weight=1)
return upper_header

def _create_upper_header_content(self, upper_header: tk.Frame) -> None:
"""Create and add content to the upper header frame."""
self._create_data_label(upper_header)
self._create_table_name_label(upper_header)
self._create_settings_label(upper_header)

def _create_data_label(self, parent: tk.Frame) -> None:
"""Create and grid the 'Data >' label."""
data_label = tk.Label(
parent,
text="Data > ",
bg=self.background_color,
fg=self.header_info_font_color,
font=self.header_info_font
)
data_label.grid(row=0, column=0, padx=22, pady=(22, 0), sticky='nw')

def _create_table_name_label(self, parent: tk.Frame) -> None:
"""Create and grid the table name label."""
self.table_name_label = tk.Label(
parent,
text=self.current_table_name if self.current_table_name else "No Table Selected",
bg=self.background_color,
fg=self.text_color,
font=self.header_info_font
)
self.table_name_label.grid(row=0, column=0, padx=(88, 10), pady=(22, 0), sticky='nw')

def _create_settings_label(self, parent: tk.Frame) -> None:
"""Create and grid the settings label with its associated menu."""
settings_label = tk.Label(
parent,
text="...",
bg=self.background_color,
fg=self.text_color,
cursor="hand2",
anchor='e'
)
settings_label.grid(row=0, column=5, padx=40, pady=20, sticky='e')

settings_menu = self._create_settings_menu()
self._bind_settings_label_events(settings_label, settings_menu)

def _create_settings_menu(self) -> tk.Menu:
"""Create the settings dropdown menu."""
menu = tk.Menu(self.root, tearoff=0)
menu.add_command(label="Export Table", command=self.export_table)
menu.add_command(label="Import Table", command=self.import_file)
menu.add_command(label="Rename Headers", command=self.rename_headers)
return menu

def _bind_settings_label_events(self, label: tk.Label, menu: tk.Menu) -> None:
"""Bind events to the settings label."""
label.bind("", lambda e: menu.post(e.x_root, e.y_root))
label.bind("", lambda _: label.config(bg=self.button_color_selected))
label.bind("", lambda _: label.config(bg=self.background_color))

def _create_lower_header(self, parent: tk.Frame) -> tk.Frame:
"""Create the lower header frame."""
lower_header = self._create_frame(parent=parent, width=None, bg=self.background_color)
lower_header.grid(row=1, column=0, columnspan=5, sticky='ew')
return lower_header

def _create_filter_controls(self, parent: tk.Frame) -> None:
"""Create and add filter controls to the lower header frame."""
self._create_filter_label(parent)
self._create_filter_header_dropdown(parent)
self._create_filter_option_dropdown(parent)
self._create_filter_text_entry(parent)

def _create_filter_label(self, parent: tk.Frame) -> None:
"""Create and grid the 'Filter:' label."""
filter_label = tk.Label(parent, text="Filter: ", bg=self.background_color, fg=self.text_color)
filter_label.grid(row=0, column=0, padx=(100, 0), pady=20, sticky='e')

def _create_filter_header_dropdown(self, parent: tk.Frame) -> None:
"""Create and grid the filter header dropdown."""
self.filter_header_dropdown = ttk.Combobox(
parent,
textvariable=self.filter_header_var,
state="readonly",
width=15
)
self.filter_header_dropdown['values'] = ["All"]
self.filter_header_dropdown.grid(row=0, column=1, padx=0, pady=0, sticky='w')
self.filter_header_dropdown.bind("<>", lambda _: self.apply_filter())

def _create_filter_option_dropdown(self, parent: tk.Frame) -> None:
"""Create and grid the filter option dropdown."""
self.filter_option_dropdown = ttk.Combobox(
parent,
textvariable=self.filter_option_var,
state="readonly",
width=15,
)
self.filter_option_dropdown['values'] = [
"is", "is not", "contains", "does not contain",
"starts with", "ends with", "is empty", "is not empty"
]
self.filter_option_dropdown.grid(row=0, column=2, padx=0, pady=0, sticky='w')
self.filter_option_dropdown.bind("<>", self.update_filter_text_state)

def _create_filter_text_entry(self, parent: tk.Frame) -> None:
"""Create and grid the filter text entry field."""
self.filter_text_entry = tk.Entry(
parent,
textvariable=self.filter_text_var,
fg=self.text_color,
width=20
)
self.filter_text_entry.grid(row=0, column=3, padx=0, pady=0, sticky='w')
self.filter_text_entry.bind("", lambda _: self.apply_filter())

def update_filter_text_state(self, event=None):
"""Enable or disable the filter text entry based on filter option."""
option = self.filter_option_var.get()
if option in ["is empty", "is not empty"]:
self.filter_text_var.set("")
self.filter_text_entry.config(state='disabled')
else:
self.filter_text_entry.config(state='normal') def apply_filter(self):
"""Apply filter to table data based on selected criteria."""
if not self.current_table_name or not self.current_sheet:
return
header = self.filter_header_var.get()
option = self.filter_option_var.get()
text = self.filter_text_var.get().lower()
original_data = self.tables_data[self.current_table_name]["data"]

def row_matches(row):
    if header == "All":
        cells = row
        target_indices = range(len(cells))
    else:
        try:
            target_indices = [self.headers[self.current_table_name].index(header)]
        except ValueError:
            return False
    
    for idx in target_indices:
        cell = str(row[idx]).lower()
        if option == "is":
            if cell == text:
                return True
        elif option == "is not":
            if cell != text:
                return True
        elif option == "contains":
            if text in cell:
                return True
        elif option == "does not contain":
            if text not in cell:
                return True
        elif option == "starts with":
            if cell.startswith(text):
                return True
        elif option == "ends with":
            if cell.endswith(text):
                return True
        elif option == "is empty":
            if cell == "":
                return True
        elif option == "is not empty":
            if cell != "":
                return True
    return False

if option in ["is empty", "is not empty"]:
    filtered_data = [row for row in original_data if row_matches(row)]
else:
    filtered_data = [row for row in original_data if row_matches(row)]

try:
    self.current_sheet.set_sheet_data(filtered_data)
except tk.TclError as e:
    print(f"Error applying filter: {e}")