Не могу переопределить фон на кнопке после нажатия в python tkinter - PullRequest
0 голосов
/ 20 февраля 2020

Я обнаружил, что при использовании привязок событий <Enter> и <Leave> к кнопке для изменения ее цвета, когда указатель мыши находится над ним, он, похоже, больше не работает после первого нажатия на саму кнопку.

Пример сценария:

from tkinter import Tk,Button

class App:
    def __init__(self):
        root=Tk()
        root.option_add('*Background','black')
        root.option_add('*Foreground','white')
        root.option_add('*Button.activeForeground','white')
        root.option_add('*Button.activeBackground','black')

        self.button=Button(root,text='Hello World')#,bg='black',fg='white')#,activebackground='white',activeforeground='black')
        self.button.pack(fill='both',expand=True,padx=10,pady=10)

        root.bind_class('Button','<Enter>',self.enter)
        root.bind_class('Button','<Leave>',self.leave)

        root.mainloop()
    def enter(self,event):
        print('entered')
        self.button.config(bg='red')
    def leave(self,event):
        print('left')
        self.button.config(bg='black')

if __name__=='__main__':
    App()

Все, что я пробовал до сих пор:

  • изменить вариант option_add на bg и так далее при инициализации
  • изменить bind_class на bind
  • полностью удалить пользовательский bg / fg / activebg / activefg (за исключением self.enter и self.leave по понятным причинам
  • добавить print, чтобы проверить, если self.enter и self.leave все еще вызывают (они делают)

Но, похоже, ничего из этого не сработало. Когда я сделал первое, что было в списке, кнопка фактически даже не изменилась на заданную. BG после нажатия.

ОС: Windows 10 Python: 3,7

Заранее спасибо.

1 Ответ

1 голос
/ 20 февраля 2020

Я могу воспроизвести вашу проблему с bind_class, но я не знаю, почему она перестает работать после нажатия кнопки. Я никогда раньше не использовал bind_class.

При этом просто использование bind на кнопке напрямую прекрасно работает.

from tkinter import Tk, Button


class App:
    def __init__(self):
        root = Tk()
        root.option_add('*Background', 'black')
        root.option_add('*Foreground', 'white')
        root.option_add('*Button.activeForeground', 'white')
        root.option_add('*Button.activeBackground', 'black')

        self.button = Button(root, text='Hello World')
        self.button.pack(fill='both', expand=True, padx=10, pady=10)

        self.button.bind('<Enter>', self.enter)
        self.button.bind('<Leave>', self.leave)

        root.mainloop()

    def enter(self, event):
        print('entered')
        self.button.config(bg='red')

    def leave(self, event):
        print('left')
        self.button.config(bg='black')


if __name__ == '__main__':
    App()

Лично при создании такого класса мне бы хотелось иметь класс наследуется от Tk() вместо определения root внутри класса.

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.option_add('*Background', 'black')
        self.option_add('*Foreground', 'white')
        self.option_add('*Button.activeForeground', 'white')
        self.option_add('*Button.activeBackground', 'black')

        self.button = tk.Button(self, text='Hello World')
        self.button.pack(fill='both', expand=True, padx=10, pady=10)

        self.button.bind('<Enter>', self.enter)
        self.button.bind('<Leave>', self.leave)

    def enter(self, event):
        print('entered')
        self.button.config(bg='red')

    def leave(self, event):
        print('left')
        self.button.config(bg='black')


if __name__ == '__main__':
    App().mainloop()
...