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

Kivy自定义ToggleButton组切换时未恢复原色的问题求助

解决Kivy组内ToggleButton切换时未自动恢复原色的问题

问题描述

在Kivy框架中自定义ToggleButton后,将按钮设置为同一组,点击组内其他按钮时,之前被选中的按钮无法自动恢复原色,仅在鼠标悬停时才会恢复。期望实现点击组内其他按钮时,之前选中的按钮自动恢复原色。

问题截图

初始状态
选中一个按钮
切换按钮后原色未恢复

问题原因

问题出在RoundedToggleButton的on_state方法中:当按钮状态切换为normal时,代码尝试启动self.hover_anim,但如果按钮从未被鼠标悬停过,hover_anim并未初始化,导致恢复原色的动画无法执行,按钮颜色停留在选中状态。

解决方案

修改RoundedToggleButton的on_state方法,在状态变为normal时直接创建并启动恢复原色的动画,不依赖未初始化的hover_anim变量。

修改后的代码

class RoundedToggleButton(ToggleButton, ToggleButtonBehavior, HoverBehavior):

    toggle_button_image = ObjectProperty(None)

    def __init__(self, **kwargs):
        super(RoundedToggleButton, self).__init__(**kwargs)
        self.down_anim = None
        self.hover_anim = None

    def on_press(self):
        pass

    def on_release(self):
        pass

    def on_state(self, widget, value):
        if value == "down":
            # 切换为选中状态时的动画
            self.down_anim = Animation(col=(0, 134/255, 179/255, 1), duration=0.2)
            self.down_anim.start(self)
        else:
            # 切换为正常状态时直接启动恢复动画
            self.normal_anim = Animation(col=(0, 191/255, 1, 1), duration=0.2)
            self.normal_anim.start(self)

    def on_enter(self, *args):
        self.hover_anim = Animation(col=(128/255, 223/255, 1, 1), duration=0.15)
        self.hover_anim.start(self)

    def on_leave(self):
        if self.state == "normal":
            self.hover_anim = Animation(col=(0, 191/255, 1, 1), duration=0.15)
        else:
            self.hover_anim = Animation(col=(0, 134/255, 179/255, 1), duration=0.15)
        self.hover_anim.start(self)

修改说明

  • 在on_state的normal分支中,直接创建新的动画实例并启动,确保无论按钮是否被悬停过,状态切换为正常时都会执行恢复原色的动画。
  • 保留原有的鼠标悬停/离开动画逻辑,不影响其他交互效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:41:17