Tkinter悬停在按钮上->颜色变化

20

当鼠标悬停在Tkinter中的一个Button上时,是否有可能更改其背景色?如果可以,该使用什么代码实现?


2
在悬停时还是悬停后?您是否使用ttk?请向我们展示您代码的[mcve]。 - Novel
2
在构建 Button 时,您可以传递一些选项来控制鼠标悬停时的颜色,这些选项称为 activebackgroundactiveforeground,尝试设置并使用它们。这里有一些文档 - martineau
2个回答

37

遗憾的是,activebackgroundactiveforeground选项似乎只在单击按钮时有效,而不是当您将鼠标悬停在按钮上时有效。请改用<Leave><Enter>事件。

import tkinter as tk

def on_enter(e):
    myButton['background'] = 'green'

def on_leave(e):
    myButton['background'] = 'SystemButtonFace'

root = tk.Tk()
myButton = tk.Button(root,text="Click Me")
myButton.grid()


myButton.bind("<Enter>", on_enter)
myButton.bind("<Leave>", on_leave)

root.mainloop()

正如评论中指出的那样,如果我们想要多个按钮,我们可以将按钮绑定到使用点击事件的事件数据来更改按钮背景的函数。

import tkinter as tk

def on_enter(e):
    e.widget['background'] = 'green'

def on_leave(e):
    e.widget['background'] = 'SystemButtonFace'

root = tk.Tk()
myButton = tk.Button(root,text="Click Me")
myButton.grid()


myButton.bind("<Enter>", on_enter)
myButton.bind("<Leave>", on_leave)

myButton2 = tk.Button(root,text="Click Me")
myButton2.grid()


myButton2.bind("<Enter>", on_enter)
myButton2.bind("<Leave>", on_leave)

root.mainloop()

对于多个按钮,更好的方法是创建一个新的


1
如果我想在鼠标悬停时更改按钮中的图像怎么办? - Raj Mehta
7
@RajMehta请提出一个新问题。 - scotty3785
3
处理多个Button的一种更简单的方法是,让绑定的函数从它们传递的事件参数中获取小部件,而不需要定义子类。例如,在函数on_enter()中使用e.widget.config(background='green'),而不是myButton['background'] = 'green' - martineau
@martineau 我已经更新了答案,也包括了这个选项。 - scotty3785
1
scotty3785:没错,这就是我建议的使回调可重用的方法——所以现在你的答案更加全面了。;¬) - martineau
这是一个非常好的解决方案。@RajMehta,我相信你可以使用on_enteron_leave函数,通过在方法内部更改图像的代码来实现。 - SamTheProgrammer

7

简单明了

背景:针对基于Unix的计算机,可能不适用于Windows或MACOSX

在您的按钮对象属性中,您有标签:activebackground&activeforeground,每当与创建的实例交互时它们会被激活。也就是说:您创建的按钮对象。

例如:

from tkinter import *

root = Tk()

button = Button(root, text="Click me", bg="#000", fg="#fff", activebackground="#f00", activeforeground="#fff")
button.pack()

root.mainloop()

2
我差点因为上面的评论和它没有得票而跳过尝试这个答案。这应该是被接受的答案。在Linux python3上,它对我来说在鼠标悬停时完美地工作。 - mp035
1
有一件事必须注意,那就是有Button和ttk.Button对象之分。关于ttk.Button对象的解决方案请参见-> https://dev59.com/il4c5IYBdhLWcg3w9-J2#65729636。 - victorkolis
我认为它被投票少是因为它似乎在 Windows 10 中无法正常工作,而许多 GUI 应用程序都是在该操作系统中分发的。 - SamTheProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接