如何在函数中间测试Tkinter悬停事件?

时间:2018-01-06 17:24:33

标签: python tkinter

所以,我有一个框架。我们称之为frame1。当鼠标悬停在此帧上时,会创建另一个帧。我们称之为frame2。 Frame2紧挨frame1创建。当鼠标离开frame1时,frame2被破坏。但是,当鼠标悬停在frame2上时,变量从0变为1以防止frame2被破坏。

这样,从理论上讲,除非鼠标悬停在不是任何一帧的东西上,否则不会破坏frame2。但是,实际上,从鼠标离开frame1调用的事件总是先被调用,所以在调用更改变量的函数之前,frame2总是被销毁。

  • 是否可以交换调用这些函数的顺序,以便在调用删除frame2的函数之前更改变量?
  • 如果订单必须保持不变,有没有办法重新检查鼠标悬停在调用删除frame2的函数内的frame2上?

我正在使用的代码的简化示例:

def __init__(self):

    def close1(event):
        self.c1 = 1
        if (self.c1 == 1) and (self.c2 == 1):
            self.frame2.destroy()

    def close2(event):
        self.c2 = 1
        if (self.c1 == 1) and (self.c2 == 1):
            self.frame2.destroy()

    def log2(event):
        self.c2 = 0

    def log(event):
        self.c1 = 0
        self.c2 = 1

        self.frame2 = Frame(self.win,height=round(self.wheight/5),width=round(self.wwidth/5),bg='blue')
        self.frame2.place(x=self.wwidth-self.wwidth/5,y=self.wheight/15)
        self.frame2.pack_propagate(0)
        self.frame2.bind("<Enter>", log2)
        self.frame2.bind("<Leave>", close2)

    self.win = Tk()
    self.win.attributes("-fullscreen", True)
    self.win.update()
    self.wheight = self.win.winfo_height()
    self.wwidth = self.win.winfo_width()

    self.frame1 = Frame(self.win,height=round(self.wheight/15),width=round(self.wwidth/10),bg='blue')
    self.frame1.place(x=self.wwidth-self.wwidth/10,y=0)
    self.frame1.pack_propagate(0)
    self.frame1.bind("<Enter>", log)
    self.frame1.bind("<Leave>", close1)

close1是在调用log2之前始终调用的函数。

1 个答案:

答案 0 :(得分:0)

您可以向被调用的close1添加延迟:

self.frame1.bind("<Leave>", lambda e: self.win.after(10, close1, e))

这样,log2将在close1之前调用,解决问题。对于用户来说,10毫秒的延迟也是不明显的。你可以改变这个值,我随意选择了10个。

我很欣赏这不是一个“干净”的解决方案 - 可能会有一个更好的解决方案!