簡體   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