Tkinters Highlight Of Button Is Not Working For Me
According to the accepted answer on this post the use of .configure(highlightbackground='red') on a button should apply a color around the button however in testing I cannot reprod
Solution 1:
Unfortunately it seems Windows OS doesn't seem to be triggering the state
and default
widget configs properly. However this is achievable by doing your own bindings.
If you only have a handful of widgets that need this behaviour, you can have create a widget wrapper:
def ResponsiveWidget(widget, *args, **kwargs):
bindings = {
'<FocusIn>': {'default':'active'}, # for Keyboard focus
'<FocusOut>': {'default': 'normal'},
'<Enter>': {'state': 'active'}, # for Mouse focus
'<Leave>': {'state': 'normal'}
}
# Create the widget instance
w = widget(*args, **kwargs)
# Set the bindings for the widget instance
for k, v in bindings.items():
w.bind(k, lambda e, kwarg=v: e.widget.config(**kwarg))
# Remember to return the created and binded widget
return w
btn = ResponsiveWidget(tk.Button, root, text='test3', bg="#000000", fg="#ffffff", highlightthickness=10, activebackground="#ffffff",
activeforeground="#000000", highlightbackground='red', highlightcolor='green')
btn2 = ResponsiveWidget(tk.Button, root, text='test4', bg="#000000", fg="#ffffff", highlightthickness=10, activebackground="#ffffff",
activeforeground="#000000", highlightbackground='green', highlightcolor='red')
On the other hand, if you wanted the entire class of the widget to always trigger the default/state properly, you can use bind_class
instead:
bindings = {
'<FocusIn>': {'default':'active'}, # for Keyboard focus
'<FocusOut>': {'default': 'normal'},
'<Enter>': {'state': 'active'}, # for Mouse focus
'<Leave>': {'state': 'normal'}
}
for k, v in bindings.items():
root.bind_class('Button', k, lambda e, kwarg=v: e.widget.config(**kwarg))
This seem to trigger the events just fine.
If you just want to replicate the functionality of the highlight colour, a less desirable method would be to change the highlightcolor
config on focus instead:
bindings = {
'<FocusIn>': {'highlightcolor':'red'},
'<FocusOut>': {'highlightcolor': 'SystemButtonFace'},
'<Enter>': {'state': 'active'},
'<Leave>': {'state': 'normal'}
}
for k, v in bindings.items():
root.bind_class('Button', k, lambda e, kwarg=v: e.widget.config(**kwarg))
# Note this method requires you to set the default='active' for your buttons
btn = tk.Button(root, text='test', bg="#000000", fg="#ffffff", highlightthickness=10, activebackground="#ffffff",
activeforeground="#000000", highlightcolor='SystemButtonFace', default='active')
# ...
I'd consider this more a hacky method.
Edit: For completeness, here's a MCVE using bind_class
:
import tkinter as tk
root = tk.Tk()
bindings = {
'<FocusIn>': {'highlightcolor':'red'},
'<FocusOut>': {'highlightcolor': 'SystemButtonFace'},
'<Enter>': {'state': 'active'},
'<Leave>': {'state': 'normal'}
}
for k, v in bindings.items():
root.bind_class('Button', k, lambda e, kwarg=v: e.widget.config(**kwarg))
btns = list(range(5))
for btn in btns:
btns[btn] = tk.Button(root, text='test', bg="#000000", fg="#ffffff", highlightthickness=5, activebackground="#ffffff",
activeforeground="#000000", highlightcolor='SystemButtonFace', default='active', padx=5, pady=5)
btns[btn].pack()
btns[0].focus_set()
root.mainloop()
And MCVE using ResponsiveWidget
function:
import tkinter as tk
root = tk.Tk()
def ResponsiveWidget(widget, *args, **kwargs):
bindings = {
'<FocusIn>': {'highlightcolor':'red'}, # for Keyboard focus
'<FocusOut>': {'highlightcolor': 'SystemButtonFace'},
'<Enter>': {'state': 'active'}, # for Mouse focus
'<Leave>': {'state': 'normal'}
}
# Create the widget instance
w = widget(*args, **kwargs)
# Set the bindings for the widget instance
for k, v in bindings.items():
w.bind(k, lambda e, kwarg=v: e.widget.config(**kwarg))
# Remember to return the created and binded widget
return w
btns = list(range(5))
for btn in btns:
btns[btn] = ResponsiveWidget(tk.Button, root, text=f'test{btn}', bg="#000000", fg="#ffffff", highlightthickness=10, activebackground="#ffffff",
activeforeground="#000000", highlightcolor='SystemButtonFace', default='active', padx=5, pady=5)
btns[btn].pack()
btns[0].focus_set()
root.mainloop()
Post a Comment for "Tkinters Highlight Of Button Is Not Working For Me"