Python tkinter 主窗口在仍在主窗口内时绑定(bind)鼠标悬停/离开触发

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

我有一个主窗口 - root

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

这在某种程度上工作得很好。

当我将鼠标从主图像移动到按钮,或从按钮移动到按钮时,程序似乎认为我实际上已经离开,然后重新进入主窗口,但情况显然并非如此。这种故障会导致程序在每次发生这种情况时重新设置主标签的动画(这是经常发生的),从而产生一个难看的 GUI。

我的理论是,按钮之间的空间(1px宽,我不知道它在那里的原因,但我无法让它消失......)实际上被程序读取为不是按钮的一部分主窗口,从而导致此问题。

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()

主标签图像定义:

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

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

最佳答案

看起来像在根顶级对象上调用bind,也会导致根的每个子对象被绑定(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

关于Python tkinter 主窗口在仍在主窗口内时绑定(bind)鼠标悬停/离开触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31726732/

相关文章:

python - 我怎样才能加快这个 Keras 注意力计算?

python - Matplotlib hexbin log scale colorbar 刻度标签作为指数

java - Android 如何制作类似下雨的动画?

python-3.x - python3类型str不支持缓冲区API

python - 从 Tkinter gui 更新 matplotlib imshow

python - 通过 python 的 matplotlib.pyplot.contourf 分散 x,y,z

java - 如何删除 JScrollPane 内 JTable 顶部的 A?

java - Android:如何避免点击通知调用 onCreate()

python - 使用 for 循环创建嵌套字典

python - 转置/反转 pandas 数据框的最简单方法是什么?