#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. @Джон Андерсон, не могли бы вы пролить свет на комментарий Абхая Кумара выше?