首页 > 解决方案 > 如何在 tkinter 中创建多个按钮,当悬停在它们上时更改背景图像?

问题描述

我正在为数学公式计算器编写 GUI。我想创建多个按钮,在将鼠标悬停在它们上方时更改背景图像,但我真的不知道该怎么做......

我已经尝试为按钮本身创建一个类,以便我可以修改它的行为,但它不起作用......

import tkinter as tk

class HoverButton(tk.Button):
    def __init__(self, master, **kw):
        tk.Button.__init__(self, master=master,**kw)
        self.defaultbackground = tk.PhotoImage(file = "GeometricBackground.png")
        self.currentbackground = tk.PhotoImage(file = "")
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)

    def on_enter(self, currentbackground):
        image = tk.Label(self, image = currentbackground)
        image.pack()
        

    def on_leave(self):
        image = tk.Label(self, image = self.defaultbackground)
        image.pack()    

root = tk.Tk()

classButton = HoverButton(root, currentbackground = "MainMenu.png")
classButton.grid()

root.mainloop()

我真的希望这会削减它,但是当它执行时我收到了这个错误消息:

_tkinter.TclError: unknown option "-currentbackground"

任何帮助,将不胜感激 :)

标签: python-3.xtkinter

解决方案


您的代码有几个问题:

  • 您得到的错误是因为您试图将currentbackground选项传递给您HoverButton,但考虑到您的类的定义方式:

    def __init__(self, master, **kw):
        tk.Button.__init__(self, master=master,**kw)
    

    currentbackground结束到您将参数传递给没有选项kw的标准 tkinter 类的字典中,因此出现未知选项错误。要修复它,您可以定义特定于您的类的选项,例如 Buttoncurrentbackground

    def __init__(self, master, defaultbackground="", currentbackground="", **kw):
        tk.Button.__init__(self, master=master, **kw)
    

    这样defaultbackgroundcurrentbackground不会在kw字典中结束。

  • 当事件发生时,绑定到该事件的函数将使用一个参数执行,“事件”对象包含有关事件的信息(如指针坐标、事件发生的小部件......)所以你需要在定义on_enter()and时添加此参数on_leave()

  • 您正在创建一个标签以将图像放入其中,然后将此标签打包在按钮中。这过于复杂(并且可能会导致按钮对点击事件没有反应)。按钮类具有image设置按钮背景图像的选项,因此您可以使用button.configure(image=<image>).

在代码中插入所有这些更改会给出

import tkinter as tk

class HoverButton(tk.Button):
    def __init__(self, master, defaultbackground="GeometricBackground.png", currentbackground="", **kw):
        tk.Button.__init__(self, master=master, **kw)
        self.defaultbackground = tk.PhotoImage(file=defaultbackground)
        self.currentbackground = tk.PhotoImage(file=currentbackground)
        self.configure(image=self.defaultbackground)
        self.bind("<Enter>", self.on_enter)
        self.bind("<Leave>", self.on_leave)

    def on_enter(self, event):
        self.configure(image=self.currentbackground)

    def on_leave(self, event):
        self.configure(image=self.defaultbackground)

root = tk.Tk()
classButton = HoverButton(root, currentbackground="MainMenu.png")
classButton.grid()
root.mainloop()    

推荐阅读