如何使frame <leave>事件考虑所有子窗口小部件?

时间:2017-07-31 20:08:45

标签: python python-3.x tkinter

我有以下代码,显示一个弹出窗口(无装饰),显示项目列表框及其在LabelFrame中的计数。

由于这是一个弹出窗口,我的目的是在光标移出窗口时隐藏该窗口。

使用下面的代码,当鼠标光标离开框架时,窗口会消失,但当鼠标移过Scrollbar时,窗口也会消失。

出于某种原因,<Leave>与对象本身的绑定也会考虑ListboxScrollbar未被占用。

为什么呢?如何修复代码,使鼠标悬停在框架的所有小部件上,使框架可见,只有当它移出整个框架时,它才会消失?

class ForeachViewer(Toplevel):
    def __init__(self, parent):
        Toplevel.__init__(self, parent)

        self.overrideredirect(True)
        self.main_frame = LabelFrame(self, text="Total:")
        self.main_frame.pack(expand=1, fill='both', padx=5, pady=5)

        self.content_items = StringVar()
        self.group_expansion = Listbox(self.main_frame,
                                       activestyle = 'none',
                                       selectmode='single',
                                       font=text_font,
                                       listvariable = self.content_items,
                                       relief='flat',
                                       highlightthickness = 0)
        self.group_expansion.grid(row=1, column=1, sticky="nswe")

        self.yscrollbar = Scrollbar(self.main_frame, orient='vertical')
        self.yscrollbar.grid(row=1, column=2, sticky='ns')

        self.group_expansion.configure(yscrollcommand=self.yscrollbar.set)
        self.yscrollbar.configure(command=self.group_expansion.yview)

        self.bind("<Leave>", lambda event : self.hide())
        self.hide()

    def contents(self, content):
        max_length = len(max(content, key=len)) + 5
        self.main_frame.configure(text= " Total Items: %d" % len(content))
        self.group_expansion.configure(state="normal", width=max_length)
        self.content_items.set(" ".join(content))
        self.group_expansion.configure(state="disable")

    def show(self, at_x, at_y):
        self.geometry("+%d+%d" % (at_x, at_y))
        self.deiconify()

    def hide(self):
        self.withdraw()

1 个答案:

答案 0 :(得分:0)

它适用于类类型绑定:

self.bind_class('Toplevel',"<Leave>", lambda event : self.hide())

第一个参数是事件所针对的类型,它可以是&#39; Button&#39;或基础类#Toplevel&#39;在你的例子中。