首页 > 解决方案 > 请给我看一个“圆角按钮”,其背景在按下时会改变颜色并在 Kivy 中释放时恢复原始颜色

问题描述

我知道如何在 on_press 和 on_release 时更改常规按钮的背景颜色,但是对于圆角按钮,常规按钮的背景颜色需要透明存在问题。我希望圆角按钮的背景颜色仅在按钮的圆角矩形内更改颜色。

当我使用下面的代码时,按钮不再以图形方式响应:

self.background_color = (0, 0, 0, 0)  # Invisible background color to regular button
self.background_normal = ''

这肯定很简单,但我无法通过谷歌找到解决方案。有错误或不完整的例子。

这是代码:

import kivy
from kivy.app import App
from kivy.properties import ListProperty
from kivy.uix.button import Button
from kivy.graphics import Color, RoundedRectangle

kivy.require('2.0.0')


class RoundedCornerButton(Button):
    background_color = ListProperty((0.5, .5, .5, .5))

    def __init__(self, **kwargs):
        super(RoundedCornerButton, self).__init__(**kwargs)
        self.draw()
        self.text = 'test'
        self.size_hint = (0.05, 0.05)
        self.pos_hint = {"center_x": 0.5, "center_y": 0.5}

    def update_shape(self, *args):
        self.shape.pos = self.pos
        self.shape.size = self.size

    def on_background_color(self, *args):
        self.shape_color.rgba = self.background_color

    def draw(self, *args):
        with self.canvas.before:
            self.shape_color = Color(rgba=(0.5, .5, .5, .5))
            self.shape = RoundedRectangle(pos=self.pos, size=self.size, radius=[15])
            self.bind(pos=self.update_shape, size=self.update_shape)

    def on_press(self, *args):
        self.background_color = (1, 0, 0, 1)

    def on_release(self, *arg):
        self.background_color = (0.5, .5, .5, .5)


class MainApp(App):
    def build(self):
        return RoundedCornerButton()


if __name__ == "__main__":
    MainApp().run()

标签: pythonkivy

解决方案


我一直在玩它并找到了解决方案。这是代码:

import kivy
from kivy.app import App
from kivy.uix.button import Button
from kivy.graphics import Color, RoundedRectangle

kivy.require('2.0.0')


class RoundedButton(Button):

    def __init__(self, **kwargs):
        super(RoundedButton, self).__init__(**kwargs)
        self.background_color = (0, 0, 0, 0)  # Invisible background color to regular button
        self.background_normal = ''

        with self.canvas.before:
            self.shape_color = Color(rgba=(0.5, .5, .5, .5))
            self.shape = RoundedRectangle(pos=self.pos, size=self.size, radius=[15])
            self.bind(pos=self.update_shape, size=self.update_shape)

        self.text = 'test'
        self.size_hint = (0.05, 0.05)
        self.pos_hint = {"center_x": 0.5, "center_y": 0.5}

    def update_shape(self, *args):
        self.shape.pos = self.pos
        self.shape.size = self.size

    def on_press(self, *args):
        self.shape_color.rgba = (0, 0, 1, 1)
        print('pressed')

    def on_release(self, *arg):
        self.shape_color.rgba = (0.5, .5, .5, .5)


class MainApp(App):
    def build(self):
        return RoundedButton()


if __name__ == "__main__":
    MainApp().run()


推荐阅读