当输入小部件不集中时,如何隐藏列表框小部件?

时间:2019-05-16 23:41:06

标签: python tkinter

我正在开发一个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 :(得分:0)

您可以使用place_forget方法删除放置的小部件。如果要显示它,则必须再次调用place。 以下是有关placeplace_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__

答案 1 :(得分:0)

使用bind并触发事件时,该函数将始终返回描述该事件的对象。您的toggle方法不带参数,因此会引发TypeError

要使您的方法有效,只需将event=None添加到您的toggle函数中即可:

def toggle(self,event=None):
    print("clicked")