You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tkinter计算器数字按钮悬停无法变色的问题求助

解决Tkinter计算器数字按钮悬停变色问题

嘿,我看了你的代码,问题其实很明显——你只给最后一个创建的按钮(也就是小数点)绑定了悬停事件,其他数字按钮根本没加上这个功能!而且事件处理函数里直接用Button变量,只会修改最后那个按钮的颜色,不是当前悬停的那个。

咱们一步步改:

问题根源

  1. 你把Button.bind()的代码写在了create_digit_buttons函数外面,循环结束后Button变量指向的是最后创建的小数点按钮,所以只有它有悬停效果。
  2. 事件函数里直接操作Button变量,而不是当前触发事件的按钮,就算绑定了所有按钮,也只会改最后一个的颜色。
  3. 全局变量create_digit_buttons完全没必要,这里根本用不上。

修改后的完整create_digit_buttons方法

把事件处理函数放到循环内部,并且用event.widget获取当前悬停的按钮:

def create_digit_buttons(self):
    # 定义悬停变色的内部函数
    def changedgt_on_hovering(event):
        event.widget['bg'] = '#F0F0F0'
    
    def returndgt_to_normalstate(event):
        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)
        # 给每个按钮绑定悬停事件
        button.bind("<Enter>", changedgt_on_hovering)
        button.bind("<Leave>", returndgt_to_normalstate)

为什么这样改能行?

  • 把事件函数放在create_digit_buttons内部,每个按钮创建时都会绑定自己的悬停事件。
  • event.widget会返回当前触发事件的那个按钮,所以悬停哪个就改哪个的背景色,不会搞混。
  • 去掉了没用的全局变量,代码更干净。

另外,记得删掉原来在类里单独写的changedgt_on_hovering、returndgt_to_normalstate函数和那两行Button.bind代码,不然会报错。

这样修改后,所有数字按钮(包括0-9和小数点)都会在鼠标悬停时变成浅灰色,离开时变回白色啦!

内容的提问来源于stack exchange,提问作者Sheran Fernando

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:32:34