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

如何在Kivy中实现鼠标悬停时按钮显示边框

解决Kivy按钮悬停显示边框的问题

核心思路是通过动态控制边框颜色的透明度实现悬停时显示边框、非悬停时隐藏边框,以下是具体修改步骤:

1. 更新Python代码

给ButtonMenu类添加border_color属性(默认透明),并在悬停事件中更新该属性:

from kivy.lang.builder import Builder
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.core.window import Window
from kivymd.uix.behaviors.hover_behavior import HoverBehavior
from kivy.app import App  # 补充原代码缺失的App导入
Window.size = (1280, 720)


class MainMenu(Screen):
    pass


class WindowManager(ScreenManager):
    pass


class ButtonMenu(Button, HoverBehavior):
    background = ListProperty((0, 0, 0, 1))
    color = ListProperty((1, 1, 1, 1))
    border_color = ListProperty((0, 0, 0, 0))  # 默认透明,隐藏边框
    border_radius = ListProperty([28])  # 统一边框与背景的圆角值

    def on_enter(self):
        self.background = (1, 222/255, 89/255, 1)
        self.color = (0, 0, 0, 1)
        self.border_color = (0, 0, 0, 1)  # 悬停时显示黑色边框

    def on_leave(self):
        self.background = (0, 0, 0, 1)
        self.color = (1, 1, 1, 1)
        self.border_color = (0, 0, 0, 0)  # 离开时隐藏边框


class TicTacToeUltimateApp(App):
    def build(self):
        return Builder.load_file('tictactoeultimate.kv')


if __name__ == '__main__':
    TicTacToeUltimateApp().run()

2. 更新KV文件

调整ButtonMenu的canvas.before部分,将边框颜色绑定到border_color属性,确保圆角参数与背景一致:

WindowManager:
    MainMenu:

<MainMenu>:
    name: 'main_menu'

    FloatLayout:
        orientation: 'horizontal'
        size: 1280, 720
        canvas.before:
            Color:
                rgba: (1, 222/255, 89/255, 1)
            Rectangle:
                pos: self.pos
                size: self.size

        ButtonMenu:
            text: 'PLAY'
            pos_hint: {'center_x': .5, 'center_y': .5}

        ButtonMenu:
            text: 'SETTINGS'
            pos_hint: {'center_x': .5, 'center_y': .35}

        ButtonMenu:
            text: 'ABOUT'
            pos_hint: {'center_x': .5, 'center_y': .2}


<ButtonMenu>
    background_color: 0, 0, 0, 0
    background_normal: ''
    size_hint: 0.3, 0.11
    font_size: 26
    font_name: 'Roboto'
    bold: True
    canvas.before:
        Color:
            rgba: self.background
        RoundedRectangle:
            size: self.size
            pos: self.pos
            radius: self.border_radius
        # 动态控制边框显示
        Color:
            rgba: self.border_color
        Line:
            rounded_rectangle: (self.pos[0], self.pos[1], self.size[0], self.size[1], self.border_radius[0])
            width: 2

关键说明

  • 通过border_color的透明度切换(0为透明、1为不透明),实现边框的显示/隐藏
  • 统一border_radius与背景圆角值,保证边框和背景的圆角匹配
  • 悬停事件中同步更新背景色、文字色和边框色,完成完整交互效果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:03:11