【问题标题】:How can I create a multiple buttons in tkinter that change the background image when hovering over them?如何在 tkinter 中创建多个按钮,当悬停在它们上时更改背景图像?
【发布时间】:2019-08-04 17:15:12
【问题描述】:

我正在为数学公式计算器编写 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.x tkinter


    【解决方案1】:

    您的代码有几个问题:

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

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

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      • 1970-01-01
      • 2021-03-22
      • 2019-12-02
      • 2013-11-02
      • 2018-05-15
      • 2018-10-31
      相关资源
      最近更新 更多