Kivy Custom Button on_press изменить цвет холста - PullRequest
0 голосов
/ 26 октября 2018

В дополнение к моему последнему вопросу, я искал в документации и в Интернете примеры того, как изменить цвет холста пользовательской кнопки при нажатии. Вот что у меня есть; при нажатии ничего не меняется:

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

Ответы [ 2 ]

0 голосов
/ 18 июля 2019

Может, кому-то поможет это решение:

.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
0 голосов
/ 26 октября 2018

Вы должны сохранить и повторно использовать инструкцию 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())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...