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



所以,我有一个框架。我们称之为frame1。当鼠标悬停在此框架上时,将创建另一个框架。我们称之为frame2。帧 2 在帧 1 旁边创建。当鼠标离开第 1 帧时,第 2 帧将被销毁。但是,当鼠标悬停在 frame2 上时,变量将从 0 更改为 1,以防止 frame2 被破坏。

这样,从理论上讲,frame2 不会被破坏,除非鼠标悬停在不是任何帧的内容上。但是,在实践中,从离开 frame1 的鼠标调用的事件总是首先调用,因此在调用更改变量的函数之前,帧 2 总是被销毁。

  • 有没有办法交换调用这些函数的顺序,以便在调用删除 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 之前调用的函数。

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

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

这样,log2将在close1之前调用,解决问题。用户也不会注意到 10 毫秒的延迟。你可以改变这个值,我任意选择了 10。

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

最新更新