【问题标题】:Change button colour when hovering over with tkinter使用 tkinter 悬停时更改按钮颜色
【发布时间】:2016-05-26 12:51:27
【问题描述】:

我正在尝试制作一个带有按钮的小部件,当我将光标悬停在它们上方时会改变颜色。使用我在 Internet 上找到的代码,我正在尝试编写一个可以执行此操作的小型测试程序。我希望能够在我左键单击时激活颜色切换并在我右键单击时禁用它。我可以激活它,但右键单击时它不会停用。

import tkinter

class App:
    def __init__(self, root):
        self.root = root
        self.mouse_pressed = False
        self.root.bind("<ButtonPress-1>", self.OnMouseDown)
        self.root.bind("<ButtonRelease-3>", self.OnMouseUp)

        self.Hover1 = tkinter.Button(root,text="Red color", bg="SystemButtonFace")
        self.Hover1.pack()

        self.Hover2 = tkinter.Button(root,text="Yellow color", bg="SystemButtonFace")
        self.Hover2.pack()



    def do_work(self):
        if self.mouse_pressed:
            self.Hover1.bind("<Enter>", lambda event, h=self.Hover1: h.configure(bg="red"))
            self.Hover1.bind("<Leave>", lambda event, h=self.Hover1: h.configure(bg="SystemButtonFace"))

            self.Hover2.bind("<Enter>", lambda event, h=self.Hover2: h.configure(bg="yellow"))
            self.Hover2.bind("<Leave>", lambda event, h=self.Hover2: h.configure(bg="SystemButtonFace"))

    def OnMouseDown(self, event):
        self.mouse_pressed = True
        self.do_work()

    def OnMouseUp(self, event):
        self.mouse_pressed = False
        self.do_work()

root=tkinter.Tk()
app = App(root)
root.mainloop()

如何停用它以使颜色停止变化?是否有可能使它仅在按下鼠标左键时才处于活动状态?

【问题讨论】:

    标签: python tkinter hover bind


    【解决方案1】:

    mouse_pressedFalse 时,您的do_work() 方法什么也不做。你应该在False时添加一些功能。

    def do_work(self):
        if self.mouse_pressed:
                ...
        else: 
            #unbind events from both buttons
            self.Hover1.unbind("<Enter>")
            self.Hover1.unbind("<Leave>")
    
            self.Hover2.unbind("<Enter>")
            self.Hover2.unbind("<Leave>")
    
            #return their color to original state
            self.Hover1.configure(bg="SystemButtonFace")
            self.Hover2.configure(bg="SystemButtonFace")
    

    【讨论】:

      【解决方案2】:

      它没有被禁用,因为按钮仍然绑定到事件,因此您需要取消绑定它们。试试这个:

          def do_work(self):
              if self.mouse_pressed:
                  self.Hover1.bind("<Enter>", lambda event, h=self.Hover1: h.configure(bg="red"))
                  self.Hover1.bind("<Leave>", lambda event, h=self.Hover1: h.configure(bg="SystemButtonFace"))
      
                  self.Hover2.bind("<Enter>", lambda event, h=self.Hover2: h.configure(bg="yellow"))
                  self.Hover2.bind("<Leave>", lambda event, h=self.Hover2: h.configure(bg="SystemButtonFace"))
              else:
                  self.Hover1.unbind("<Enter>")
                  self.Hover1.unbind("<Leave>")
                  self.Hover2.unbind("<Enter>")
                  self.Hover2.unbind("<Leave>")
      

      【讨论】:

        猜你喜欢
        • 2023-01-23
        • 2017-07-21
        • 2012-08-16
        • 2018-09-01
        • 2021-11-10
        • 2019-10-19
        • 2021-09-18
        • 2021-06-04
        • 2021-03-22
        相关资源
        最近更新 更多