2016-02-15 2 views
1

Я пытаюсь создать виджет с кнопками, которые меняют цвет, когда я наводил на них курсор. Используя код, который я нашел в Интернете, я пытаюсь написать небольшую тестовую программу, которая может это сделать. Я хочу, чтобы активировать переключение цвета, когда я щелкнул левой кнопкой мыши и деактивировал его, когда я щелкнул правой кнопкой мыши. Я могу активировать его, но он не деактивируется, когда я нажимаю правой кнопкой мыши.Изменить цвет кнопки при наведении курсора на tkinter

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

Как отключить его, чтобы цвет переставал меняться? Также можно было бы сделать так, чтобы он был активен только при нажатой левой кнопке мыши?

ответ

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>") 
3

Ваш метод do_work() ничего не делает, когда mouse_pressed является 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") 
Смежные вопросы