请给我看一个'rounded corners button',其背景在按下时会改变颜色,在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()

我一直在玩,找到了解决方案。下面是代码:

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()

最新更新