python - 请给我看一个“圆角按钮”,其背景在按下时会改变颜色并在 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()
推荐阅读
- craftcms - 将 CMS 路由到插件控制器操作错误 - HTTP 404 - 未找到 - yii\web\NotFoundHttpException
- javascript - 在 Angular 中使用源映射生成生产版本 - CLI
- javascript - 烧瓶关闭闪烁消息
- python - 问题运行 gunicorn 以服务于烧瓶应用程序
- c++ - 使用赋值运算符将宏转换为函数调用
- cmake - 一个项目A依赖共享库B,B依赖C,A不依赖C,为什么需要在A的CMakelist.txt中找到find_package和targe_link C?
- regex - 针对正则表达式奇怪行为scala的模式匹配
- hibernate - 原生 SQL + Hibernate 多租户
- python - 在 python 子进程之间共享对象
- scala - 如何在 Scala 中使用 Cats 将 Option[A] 转换为 Either[String, B]?