Tkinter计算器数字按钮悬停无法变色的问题求助
解决Tkinter计算器数字按钮悬停变色问题
嘿,我看了你的代码,问题其实很明显——你只给最后一个创建的按钮(也就是小数点)绑定了悬停事件,其他数字按钮根本没加上这个功能!而且事件处理函数里直接用Button变量,只会修改最后那个按钮的颜色,不是当前悬停的那个。
咱们一步步改:
问题根源
- 你把
Button.bind()的代码写在了create_digit_buttons函数外面,循环结束后Button变量指向的是最后创建的小数点按钮,所以只有它有悬停效果。 - 事件函数里直接操作
Button变量,而不是当前触发事件的按钮,就算绑定了所有按钮,也只会改最后一个的颜色。 - 全局变量
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
相关产品推荐
相关产品推荐

