【问题标题】:Kivy Custom Button on_press change canvas colourKivy 自定义按钮 on_press 更改画布颜色
【发布时间】:2019-07-18 16:41:36
【问题描述】:

关于我的最后一个问题,我一直在查看文档和在线示例,了解如何在按下时更改自定义按钮的画布颜色。这就是我所拥有的;单击时没有任何变化:

class CircularButton(ButtonBehavior, Label):

    # code inspired from:
        # https://github.com/kivy/kivy/issues/4263#issuecomment-217430358
        # https://stackoverflow.com/a/42886979/6924364
        # https://blog.kivy.org/2014/10/updating-canvas-instructions-declared-in-python/

    def __init__(self, **kwargs):
        super(CircularButton,self).__init__(**kwargs)

        with self.canvas.before:
            Color(rgba=(.5,.5,.5,.5))
            self.shape = Ellipse(pos=self.pos,size=self.size)

        self.bind(pos=self.update_shape, size=self.update_shape)

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

    def on_press(self, *args): #<--- what am I doing wrong here?
        with self.canvas:
            Color(rgba=(0,0,0,0))

    def collide_point(self, x, y):
        return Vector(x, y).distance(self.center) <= self.width / 2

【问题讨论】:

    标签: python kivy


    【解决方案1】:

    您必须存储和重复使用 Color 指令并在 Canvas 添加指令时更改颜色,在您的情况下,您正在添加一个新的 Color 指令,该指令不适用于 Rectangle 或 Ellipse 等其他元素,因此您看不到效果.

    from kivy.base import runTouchApp
    from kivy.uix.behaviors import ButtonBehavior
    from kivy.uix.label import Label
    from kivy.vector import Vector
    from kivy.graphics import Color, Ellipse
    from kivy.properties import ListProperty
    
    
    class CircularButton(ButtonBehavior, Label):
        background_color = ListProperty((0.5,.5,.5,.5))
    
        def __init__(self, **kwargs):
            super(CircularButton,self).__init__(**kwargs)
            self.draw()
            self.text='test'
    
        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 = Ellipse(pos=self.pos,size=self.size)
                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)
    
        def collide_point(self, x, y):
            return Vector(x, y).distance(self.center) <= self.width / 2
    
    if __name__ == '__main__':
        runTouchApp(CircularButton())
    

    虽然我更喜欢将 .kv 和 .py 结合起来,但利用 kv 语言是声明式的,使得连接很简单:

    from kivy.base import runTouchApp
    from kivy.uix.behaviors import ButtonBehavior
    from kivy.uix.label import Label
    from kivy.vector import Vector
    from kivy.lang import Builder
    
    
    Builder.load_string('''
    <CircularButton>
        background_color: 0.5,.5,.5,.5
        canvas.before:
            Color:
                rgba: self.background_color
            Ellipse:
                pos: self.pos
                size: self.size
        ''')
    
    
    class CircularButton(ButtonBehavior, Label):
        def __init__(self, **kwargs):
            super(CircularButton, self).__init__(**kwargs)
            self.text = "test"
    
        def on_press(self, *args):
            self.background_color = (1, 0, 0, 1)
    
        def collide_point(self, x, y):
            return Vector(x, y).distance(self.center) <= self.width / 2
    
    if __name__ == '__main__':
        runTouchApp(CircularButton())
    

    【讨论】:

    • 爱它!我尝试添加函数on_release 将颜色重置回.5,.5,.5,.5,但它只会使红色变暗而不是变回灰色。怎么会?
    • @Justapigeon 试试第二种方法,我会找出第一种方法失败的原因
    • 有趣的是,当我检查画布时,颜色对象的 rgba 值是 1.0、1.0、1.0、1.0,尽管分配了颜色。
    • @Justapigeon 我已经更新了我的答案,很困惑,认为画布消除了以前的但事实并非如此,添加它以供您重复使用,我已经在更新的答案中指出,测试返回并告诉我您是否仍有错误。
    • 天才!谢谢!
    【解决方案2】:

    也许可以帮助某人解决这个问题:

    .py

    class PositionButton(Button):
        b_color = ListProperty()
    

    .kv

    <PositionButton>:
        background_color: [0,0,0,0]
        b_color: [0, 0, 1, .3] if self.state == 'normal' else [0, 0, 1, .5]
        canvas.before:
            Color:
                rgba: self.b_color
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 2020-03-10
      • 2019-06-28
      相关资源
      最近更新 更多