Python 使用tkinter悬停在上方时更改按钮颜色

Python 使用tkinter悬停在上方时更改按钮颜色,python,tkinter,hover,bind,Python,Tkinter,Hover,Bind,我试图制作一个小部件,当我用光标悬停在按钮上时,按钮会改变颜色。使用我在互联网上找到的代码,我试图编写一个小的测试程序,可以做到这一点。我希望能够在左键单击时激活颜色切换,在右键单击时将其禁用。我可以激活它,但当我右键单击时它不会停用 import tkinter class App: def __init__(self, root): self.root = root self.mouse_pressed = False self.ro

我试图制作一个小部件,当我用光标悬停在按钮上时,按钮会改变颜色。使用我在互联网上找到的代码,我试图编写一个小的测试程序,可以做到这一点。我希望能够在左键单击时激活颜色切换,在右键单击时将其禁用。我可以激活它,但当我右键单击时它不会停用

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()
导入tkinter
类应用程序:
定义初始化(自,根):
self.root=根
self.mouse_pressed=False
self.root.bind(“,self.OnMouseDown)
self.root.bind(“,self.OnMouseUp)
self.Hover1=tkinter.Button(根,text=“红色”,bg=“SystemButtonFace”)
self.Hover1.pack()
self.Hover2=tkinter.Button(根,text=“黄色”,bg=“SystemButtonFace”)
self.Hover2.pack()
def do_工作(自我):
如果按下self.mouse_:
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“红色”))
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“SystemButtonFace”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“黄色”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“SystemButtonFace”))
def OnMouseDown(自身、事件):
self.mouse_pressed=True
self.do_工作()
def OnMouseUp(自我、事件):
self.mouse_pressed=False
self.do_工作()
root=tkinter.Tk()
app=app(根目录)
root.mainloop()
如何停用它以使颜色停止变化?是否可以使is仅在按下鼠标左键时处于活动状态

当按下
鼠标时,您的
do\u work()
方法不会执行任何操作
False
。当它为
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")
def do_work(自我):
如果按下self.mouse_:
...
其他:
#从两个按钮取消绑定事件
self.Hover1.unbind(“”)
self.Hover1.unbind(“”)
self.Hover2.unbind(“”)
self.Hover2.unbind(“”)
#将其颜色恢复到原始状态
self.Hover1.configure(bg=“SystemButtonFace”)
self.Hover2.configure(bg=“SystemButtonFace”)
当按下
鼠标时,您的
do\u work()
方法不会执行任何操作
False
。当它为
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")
def do_work(自我):
如果按下self.mouse_:
...
其他:
#从两个按钮取消绑定事件
self.Hover1.unbind(“”)
self.Hover1.unbind(“”)
self.Hover2.unbind(“”)
self.Hover2.unbind(“”)
#将其颜色恢复到原始状态
self.Hover1.configure(bg=“SystemButtonFace”)
self.Hover2.configure(bg=“SystemButtonFace”)

由于按钮仍然绑定到事件,因此它不会被停用,因此您需要解除它们的绑定。试试这个:

    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>")
def do_work(自我):
如果按下self.mouse_:
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“红色”))
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“SystemButtonFace”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“黄色”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“SystemButtonFace”))
其他:
self.Hover1.unbind(“”)
self.Hover1.unbind(“”)
self.Hover2.unbind(“”)
self.Hover2.unbind(“”)

由于按钮仍然绑定到事件,因此它不会被停用,因此您需要解除它们的绑定。试试这个:

    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>")
def do_work(自我):
如果按下self.mouse_:
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“红色”))
self.Hover1.bind(“,lambda事件,h=self.Hover1:h.configure(bg=“SystemButtonFace”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“黄色”))
self.Hover2.bind(“,lambda事件,h=self.Hover2:h.configure(bg=“SystemButtonFace”))
其他:
self.Hover1.unbind(“”)
self.Hover1.unbind(“”)
self.Hover2.unbind(“”)
self.Hover2.unbind(“”)