Python tkinter主窗口在鼠标主窗口

时间:2015-07-30 14:35:47

标签: python user-interface python-3.x graphics tkinter

我有一个主窗口 - root

在其中我在顶部有一个主标签图像,然后是下面的一些按钮,当鼠标移过它们时,按钮会改变它们的图像(动画),但是当鼠标完全进入主窗口时,主标签图像会这样做,当鼠标离开应用程序时,恢复为关闭图像。

这一点工作得很好。

当我将鼠标从主图像移动到按钮,或从按钮移动到按钮时,程序似乎认为我实际上已离开,然后重新进入主窗口,显然不是这种情况。这种故障导致程序每次发生这种情况时都会重新制作主标签(通常是这样),从而产生丑陋的gui。

我的理论是按钮之间的空间(1px宽的idk是什么原因,但我不能让它消失...)实际上是由程序读取的,因为它不是一块主窗口,从而导致这个问题。

Image with details

#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

我是编程的新手,所以请耐心等待我:)

1 个答案:

答案 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