Как бы я скрыл виджет списка, когда виджет ввода не сфокусирован? - PullRequest
0 голосов
/ 17 мая 2019

Я работаю над приложением tkinter и пытаюсь показать список только тогда, когда виджет записи (и, конечно, сам список) не получил фокус.Другими словами, он отображает подсказки поиска только тогда, когда вы находитесь в виджете / наборе ввода.

    self.from_query.bind("<FocusIn>", self.updateList)
    self.from_query.bind("<FocusOut>", self.toggle)

    # Dynamically updates the query frames listboxes
    def updateList(self, *args):

        search_term = self.users_search.get()

        self.from_listbox = Listbox(root)
        self.from_listbox.place(x=100, y=652)
        self.from_listbox.pi = self.from_listbox.place_info()
        self.from_listbox.config(highlightbackground="red")

        test_lbox = ['Adam', 'Lucy', 'Barry', 'Bob', 'James', 'Frank', 'Susan', 'Amanda', 'Christie']

        self.from_listbox.delete(0, END)

        for item in test_lbox:
            if search_term.lower() in item.lower():
                self.from_listbox.insert(END, item)
    def toggle(self):
        print("clicked")

Я попытался создать функцию переключения, которая просто печатает «нажал», когда запись больше не имеет фокуса, ноникогда не запускается эта функция

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Когда вы используете bind и событие инициируется, функция всегда возвращает объект, описывающий событие. Ваш метод toggle не требует аргументов, поэтому он вызовет TypeError.

Чтобы ваш метод работал, просто добавьте event=None к вашей toggle функции:

def toggle(self,event=None):
    print("clicked")
0 голосов
/ 17 мая 2019

Вы можете использовать метод place_forget для удаления размещенных виджетов. Если вы хотите, чтобы это показывалось, вам придется снова позвонить place. Вот некоторая информация о методах place и place_forget: https://effbot.org/tkinterbook/place.htm

т.е:.

def toggle(self):
    if self.listbox_is_showing:
        self.listbox.place_forget()
        self.listbox_is_showing = False
    else:
        self.listbox.place(x=100, y=652)
        self.listbox_is_showing = True

вам нужно будет установить listbox_is_showing в __init__

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...