繁体   English   中英

将鼠标悬停在 Tkinter 中的按钮上时如何更改颜色?

[英]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(如yellowredgreen等),您还可以使用十六进制 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM