所以,我有一个框架。我们称之为frame1。当鼠标悬停在此帧上时,会创建另一个帧。我们称之为frame2。 Frame2紧挨frame1创建。当鼠标离开frame1时,frame2被破坏。但是,当鼠标悬停在frame2上时,变量从0变为1以防止frame2被破坏。
这样,从理论上讲,除非鼠标悬停在不是任何一帧的东西上,否则不会破坏frame2。但是,实际上,从鼠标离开frame1调用的事件总是先被调用,所以在调用更改变量的函数之前,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之前始终调用的函数。
答案 0 :(得分:0)
您可以向被调用的close1
添加延迟:
self.frame1.bind("<Leave>", lambda e: self.win.after(10, close1, e))
这样,log2
将在close1
之前调用,解决问题。对于用户来说,10毫秒的延迟也是不明显的。你可以改变这个值,我随意选择了10个。
我很欣赏这不是一个“干净”的解决方案 - 可能会有一个更好的解决方案!