Как создать круглую или круглую кнопку в Kivy, используя. Кв и без использования. KV файл - PullRequest
0 голосов
/ 25 февраля 2020

Я новичок ie в Kivy, и я хочу знать, как мы можем создать круглую или округлую кнопку, используя Kivy (с файлом .kv и без него).

1 Ответ

0 голосов
/ 26 февраля 2020

Есть много способов создать круглую кнопку. Вот только один способ:

from kivy.clock import Clock
from kivy.lang import Builder
from kivy.properties import ObjectProperty
from kivy.uix.floatlayout import FloatLayout


class CircularButton(FloatLayout):
    button = ObjectProperty()

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

        # all size and position attributes get assigned to the CircularButton
        # the below is not an exhaustive list
        if 'size_hint' in kwargs:
            self.size_hint = kwargs.pop('size_hint', (1,1))
        if 'size' in kwargs:
            self.size = kwargs.pop('size', (100, 100))
        if 'width' in kwargs:
            self.width = kwargs.pop('width', 100)
        if 'height' in kwargs:
            self.height = kwargs.pop('height', 100)
        if 'pos_hint' in kwargs:
            self.pos_hint = kwargs.pop('pos_hint', (None, None))
        if 'pos' in kwargs:
            self.pos = kwargs.pop('pos', (0,0))
        if 'x' in kwargs:
            self.x = kwargs.pop('x', 0)
        if 'y' in kwargs:
            self.y = kwargs.pop('y', 0)

        # remaining args get applied to the Button
        self.butt_args = kwargs
        Clock.schedule_once(self.set_button_attrs)

    def set_button_attrs(self, dt):
        for k,v in self.butt_args.items():
            setattr(self.button, k, v)


Builder.load_string('''
<CircularButton>:
    button: button
    canvas.before:
        StencilPush
        Ellipse:
            # self.pos and self.size should work here
            # adjustments are just hacks to get it to look right
            pos: self.x+1, self.y+2
            size: self.width-2, self.height-2
        StencilUse
    canvas.after:
        StencilUnUse
        Ellipse:
            pos: self.x+1, self.y+2
            size: self.width-2, self.height-2
        StencilPop
    Button:
        id: button
        pos_hint: {'center_x':0.5, 'center_y':0.5}
        size_hint: None, None
        size: root.size
''')

if __name__ == '__main__':
    from kivy.app import App

    class TestApp(App):
        def build(self):
            return CircularButton(text='Circular Button', size_hint=(None, None), size=(150, 150), pos_hint={'right':1, 'top':1}, on_release=self.butt)

        def butt(self, *args):
            print('button pressed')

    TestApp().run()
...