[英]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.