Пожалуйста, покажите мне «кнопку с закругленными углами», фон которой меняет цвет при нажатии и восстанавливает первоначальный цвет при выпуске в Kivy

#python #kivy

Вопрос:

Я знаю, как изменить цвет фона обычной кнопки при on_press и on_release, но с кнопкой со скругленными углами возникает проблема с цветом фона обычной кнопки, который должен быть прозрачным. Я хочу, чтобы цвет фона закругленной кнопки менял цвет только в пределах закругленного прямоугольника кнопки.

Когда я использую приведенный ниже код, кнопка больше не реагирует графически:

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

Это, безусловно, должно быть просто, но я не могу найти решение через Google. Есть ошибочные или неполные примеры.

Вот код:

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

Ответ №1:

Я продолжал играть с ним и нашел решение. Вот код:

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

 

Комментарии:

1. Это не идеальная кнопка, потому что она похожа на квадратную кнопку, и ее также можно нажать, нажав на внешние углы. Если у вас тоже есть какое-либо решение этой проблемы, пожалуйста, поделитесь. Мне нужно постоянное решение для всех типов фигур.

2. @Джон Андерсон, не могли бы вы пролить свет на комментарий Абхая Кумара выше?