Reputation: 3
Is it possible to configure TTKWidgets to automatically show the dropdown box as I start typing in a combobox?
I have a very large data set, so it would be ideal to be able to type a letter and automatically see a drop down of possible values. Currently, I have to stop typing and click on the arrow each time to show matching values.
The confounding factor in why I am not using other autocomplete methods is that I also want to populate Field 1 based on an index of Field 2, while keeping Field 2 editable.
import tkinter as tk
from ttkwidgets.autocomplete import AutocompleteCombobox
from tkinter import *
import json
app = Tk()
app.geometry("400x350")
Field_1List = [
"Apple", "Banana", "Cherry", "Date", "Elderberry", "Fig", "Grape", "Honeydew melon",
"Indian fig (prickly pear)", "Jackfruit", "Kiwi", "Lemon", "Mango", "Nectarine", "Orange",
"Papaya", "Quince", "Raspberry", "Strawberry", "Tangerine", "Ugli fruit", "Valencia orange",
"Watermelon", "Xigua (another term for watermelon)", "Yellow passion fruit", "Zucchini",
"Artichoke", "Broccoli", "Carrot", "Daikon radish", "Eggplant", "Fennel", "Garlic",
"Habanero pepper", "Iceberg lettuce", "Jicama", "Kale", "Leek", "Mushroom", "Napa cabbage",
"Okra", "Pea", "Quinoa", "Radicchio", "Spinach", "Tomato", "Ube (purple yam)",
"Vidalia onion", "Watercress", "Yam"
]
Field_2List = ["Fruit","Vegetable"]
Field_2_lookup = {
"Apple": "Fruit","Banana": "Fruit","Cherry": "Fruit","Date": "Fruit","Elderberry": "Fruit","Fig": "Fruit","Grape": "Fruit",
"Honeydew melon": "Fruit","Indian fig (prickly pear)": "Fruit","Jackfruit": "Fruit",
"Kiwi": "Fruit","Lemon": "Fruit","Mango": "Fruit","Nectarine": "Fruit","Orange": "Fruit","Papaya": "Fruit",
"Quince": "Fruit","Raspberry": "Fruit","Strawberry": "Fruit","Tangerine": "Fruit","Ugli fruit": "Fruit","Valencia orange": "Fruit",
"Watermelon": "Fruit","Xigua (another term for watermelon)": "Fruit","Yellow passion fruit": "Fruit","Zucchini": "Fruit",
"Artichoke": "Vegetable","Broccoli": "Vegetable","Carrot": "Vegetable","Daikon radish": "Vegetable",
"Eggplant": "Vegetable","Fennel": "Vegetable","Garlic": "Vegetable","Habanero pepper": "Vegetable", "Iceberg lettuce": "Vegetable",
"Jicama": "Vegetable","Kale": "Vegetable","Leek": "Vegetable","Mushroom": "Vegetable","Napa cabbage": "Vegetable",
"Okra": "Vegetable","Pea": "Vegetable","Quinoa": "Vegetable","Radicchio": "Vegetable",
"Spinach": "Vegetable","Tomato": "Vegetable","Ube (purple yam)": "Vegetable","Vidalia onion": "Vegetable",
"Watercress": "Vegetable","Yam": "Vegetable"
}
Field_1_var = tk.StringVar()
Label(app, text="Field_1: ", padx=3, pady=3).grid(column=0, row=0)
Field_1_entry = AutocompleteCombobox(width=45, textvariable=Field_1_var, completevalues=Field_1List)
Field_1_entry.grid(column=1, row=0, padx=20, pady=20)
Field_2_var = tk.StringVar()
Label(app, text="Field_2: ", padx=3, pady=3).grid(column=0, row=20)
Field_2_entry = AutocompleteCombobox(app, width=45, textvariable=Field_2_var, completevalues=Field_2List)
Field_2_entry.grid(column=1, row=20)
def key_pressed(*_args):
Field_2_entry.delete(0, END)
try:
Field_2_entry.insert(0, Field_2_lookup[Field_1_entry.get()])
except KeyError:
pass
Field_2_entry.delete(0, END)
Field_1_entry.delete(0, END)
Field_1_var.trace("w", key_pressed)
# Field_2_var.trace("w", key_pressed) # get rid of this trace
app.mainloop()
Upvotes: 0
Views: 47