我有一个主窗口 - root
。
在其中我在顶部有一个主标签图像,然后是下面的一些按钮,当鼠标移过它们时,按钮会改变它们的图像(动画),但是当鼠标完全进入主窗口时,主标签图像会这样做,当鼠标离开应用程序时,恢复为关闭图像。
这一点工作得很好。
当我将鼠标从主图像移动到按钮,或从按钮移动到按钮时,程序似乎认为我实际上已离开,然后重新进入主窗口,显然不是这种情况。这种故障导致程序每次发生这种情况时都会重新制作主标签(通常是这样),从而产生丑陋的gui。
我的理论是按钮之间的空间(1px宽的idk是什么原因,但我不能让它消失...)实际上是由程序读取的,因为它不是一块主窗口,从而导致这个问题。
#Python 3.4.3 on Win7 x64
def startApp (): #initializes crucial tkinter gui components
global root
root = Tk()
root.configure(bg="white")
root.resizable(width=FALSE, height=FALSE)
#******
root.bind ("<Enter>", turnMainImageOn1)
root.bind("<Leave>", turnMainImageOff)
#******
drawMainWindow()
root.mainloop()
主标签图片def:
mainImageOff = PhotoImage(file="Resources/Main/mainImageOff.png") #main window logo image
mainImageLabel = Label(root, image=mainImageOff, bd=0, bg="white")
mainImageLabel.image = mainImageOff
mainImageLabel.pack(side=TOP)
然后动画自身起作用:
def turnMainImageOn1 (event): #main image on animation frame 1
mainImageOn1 = PhotoImage(file="Resources/Main/mainImageOn_1.png")
mainImageLabel.configure(image=mainImageOn1)
mainImageLabel.image = mainImageOn1
root.after(17, turnMainImageOn2)
def turnMainImageOn2 (): #main image on animation frame 2
mainImageOn2 = PhotoImage(file="Resources/Main/mainImageOn_2.png")
mainImageLabel.configure(image=mainImageOn2)
mainImageLabel.image = mainImageOn2
root.after(17, turnMainImageOn3)
def turnMainImageOn3 (): #main image on animation frame 3
mainImageOn3 = PhotoImage(file="Resources/Main/mainImageOn_3.png")
mainImageLabel.configure(image=mainImageOn3)
mainImageLabel.image = mainImageOn3
def turnMainImageOff (event): #sets main image to off
mainImageOff = PhotoImage(file="Resources/Main/mainImageOff.png")
mainImageLabel.configure(image=mainImageOff)
mainImageLabel.image = mainImageOff
我是编程的新手,所以请耐心等待我:)
答案 0 :(得分:1)
看起来在根Toplevel对象上调用bind
,也会导致绑定根的每个子对象。因此,只要光标离开任何小部件,而不仅仅是主窗口,turnMainImageOff
就会触发。
一种可能的解决方案是检查事件对象以确定触发事件的窗口小部件。然后,您可以提前返回除根之外的任何小部件。
def turnMainImageOn1 (event):
if event.widget != root:
return
#rest of function goes here
#...
def turnMainImageOff (event): #sets main image to off
if event.widget != root:
return
#rest of function goes here