[英]How to change color when hovering over a button in Tkinter?
我使用 tkinter 制作了一个计算器。在其中,我想在 hover 超过它时更改按钮的颜色。 我确实改变了一些按钮的颜色,但是当我 hover 时我无法改变数字按钮的颜色。
self.digits = {
7:(1,1), 8:(1,2), 9:(1,3),
4:(2,1), 5:(2,2), 6:(2,3),
1:(3,1), 2:(3,2), 3:(3,3),
0:(4,2), ".":(4,1),
}
那是我用来输入数字的代码。
def create_digit_buttons(self):
for digit,grid_value in self.digits.items():
Button = tk.Button(self.buttons_frame, text=str(digit), bg="#fff", fg="#25265E", font=("Arial", 24, "bold"), borderwidth=0,
command=lambda x=digit: self.add_to_expressions(x))
Button.grid(row=grid_value[0], column=grid_value[1], sticky=tk.NSEW)
上面的代码是我用于数字按钮的代码。
def changedgt_on_hovering(event):
global create_digit_buttons
Button['bg']='#F0F0F0'
def returndgt_to_normalstate(event):
global create_digit_buttons
Button['bg']='#fff'
Button.bind("<Enter>", changedgt_on_hovering)
Button.bind("<Leave>",returndgt_to_normalstate)
那是我在将鼠标悬停在数字按钮上时用来更改数字按钮颜色的代码。 没有任何错误信息; 只有小数点按钮在悬停时会改变颜色,因为我在 self.digits 部分添加了小数点(“。”)。
下面是必要部分的完整代码......请帮助我(我是新手)
from tkinter import *
import tkinter as tk
LABEL_COLOR = "#25265E"
DEFAULT_FONT_STYLE = ("Arial", 20,"bold")
OFF_WHITE = "#F8FAFF"
class Calculator:
def __init__(self):
self.window = tk.Tk()
self.window.geometry("375x660")
self.window.resizable(height=True, width= True)
self.window.title("Calculator")
self.total_expression = ""
self.current_expression = ""
self.display_frame = self.create_display_frame()
self.total_label, self.label =self.create_display_labels()
self.digits = {
7:(1,1), 8:(1,2), 9:(1,3),
4:(2,1), 5:(2,2), 6:(2,3),
1:(3,1), 2:(3,2), 3:(3,3),
0:(4,2), ".":(4,1),
}
self.operations = {"/": "\u00F7", "*": "\u00D7","-": "-", "+": "+"}
self.buttons_frame = self.create_buttons_frame()
self.buttons_frame.rowconfigure(0, weight=1)
for x in range(1,5):
self.buttons_frame.rowconfigure(x, weight=1)
self.buttons_frame.columnconfigure(x, weight=1)
self.create_digit_buttons()
self.create_operator_buttons()
self.create_special_buttons()
self.bind_keys()
def bind_keys(self):
self.window.bind("<Return>", lambda event: self.evaluate())
self.window.bind("<BackSpace>", lambda event: self.delete())
for key in self.digits:
self.window.bind(str(key), lambda event, digits = key: self.add_to_expressions(digits))
for key in self.operations:
self.window.bind(key, lambda event, operator = key: self.append_operator(operator))
def create_special_buttons(self):
self.create_clear_button()
self.create_equals_button()
self.create_delete_button()
self.create_square_button()
self.create_sqrt_button()
def create_display_labels(self):
total_label=tk.Label(self.display_frame, text= self.total_expression, anchor=tk.E, bg="#f5f5f5", fg="#25265E", padx=24, font=
("Arial", 24))
total_label.pack(expand=True, fill="both")
label=tk.Label(self.display_frame, text= self.current_expression, anchor=tk.E, bg="#f5f5f5", fg="#25265E", padx=24, font=
("Arial", 40, "bold"))
label.pack(expand=True, fill="both")
return total_label,label
def create_display_frame(self):
Frame = tk.Frame(self.window, height=221, bg="#f5f5f5")
Frame.pack(expand=True, fill="both")
return Frame
def add_to_expressions(self, value):
self.current_expression += str(value)
self.update_label()
def create_digit_buttons(self):
for digit,grid_value in self.digits.items():
Button = tk.Button(self.buttons_frame, text=str(digit), bg="#fff", fg="#25265E", font=("Arial", 24, "bold"), borderwidth=0,
command=lambda x=digit: self.add_to_expressions(x))
Button.grid(row=grid_value[0], column=grid_value[1], sticky=tk.NSEW)
def changedgt_on_hovering(event):
global create_digit_buttons
Button['bg']='#F0F0F0'
def returndgt_to_normalstate(event):
global create_digit_buttons
Button['bg']='#fff'
Button.bind("<Enter>", changedgt_on_hovering)
Button.bind("<Leave>",returndgt_to_normalstate)
要在用户将鼠标悬停在按钮上时更改按钮的颜色,只需将activebackground
选项定义为您想要的颜色即可。 这是一个简单的例子:
import tkinter
window = tkinter.Tk()
button = tkinter.Button(window, activebackground="red")
button.pack()
window.mainloop()
这会在用户将鼠标悬停在按钮上时将按钮变为红色,并在用户停止将鼠标悬停在其上时将其恢复为原始颜色。
除了使用单词指定 colors(如yellow
、 red
、 green
等),您还可以使用十六进制 colors (如#ffff00
、 #ff0000
、 #0000ff
等)。
您可以修改create_digit_buttons()
如下:
def create_digit_buttons(self):
def changedgt_on_hovering(event):
# use event.widget instead of hard-coded Button
event.widget['bg']='#F0F0F0'
def returndgt_to_normalstate(event):
# use event.widget instead of hard-coded Button
event.widget['bg']='#fff'
for digit,grid_value in self.digits.items():
Button = tk.Button(self.buttons_frame, text=str(digit), bg="#fff", fg="#25265E", font=("Arial", 24, "bold"), borderwidth=0,
command=lambda x=digit: self.add_to_expressions(x))
Button.grid(row=grid_value[0], column=grid_value[1], sticky=tk.NSEW)
# moved the binding code inside for loop
Button.bind("<Enter>", changedgt_on_hovering)
Button.bind("<Leave>", returndgt_to_normalstate)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.