Как назначить холст нескольким виджетам в Kivy - PullRequest
0 голосов
/ 22 января 2019

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

В своем коде я попытался self.cavas.add(...), а в приведенном ниже коде я использую with self.canvas:.Обе попытки привели к рисованию холста в углу экрана, а не внутри виджетов.

Как поместить холст внутри каждого виджета с использованием кода Python?

Код :

from kivy.app import App
from kivy.core.window import Window
from kivy.graphics.context_instructions import Color
from kivy.graphics.vertex_instructions import Rectangle
from kivy.lang import Builder
from random import random
from kivy.uix.button import Button
from kivy.animation import Animation
from kivy.clock import Clock

class LittleButtons(Button):

    dur = 2

    def reup(self, *args):

        Animation.cancel_all(self)
        Animation(pos_hint = {'center_x': random(), 'center_y': random()}, duration = self.dur).start(self)

    def __init__(self, **kwargs):

        super(LittleButtons, self).__init__(**kwargs)
        self.pos_hint = {'center_x': random(), 'center_y': random()}
        self.size_hint = None, None
        self.width = random() * (Window.width / 20)
        self.height = self.width
        self.background_color = [0,0,0,.05]
        with self.canvas:
            Color(rgba = [1,1,1,.2])
            Rectangle(pos = self.pos, size = self.size)

        Animation(pos_hint = {'center_x': random(), 'center_y': random()}, duration = self.dur).start(self)
        Clock.schedule_interval(self.reup, self.dur)

KV = Builder.load_string("""
#:import Factory kivy.factory.Factory

Screen:
    FloatLayout:
        on_parent:
            (lambda ltext: [self.add_widget(Factory.LittleButtons(text=ltext)) for i in range (150)])('hi!')
        Button:
            background_color: 0,0,0,0
            canvas:
                Color:
                    rgba: 0,1,1,1
                Rectangle:
                    pos: self.pos
                    size:self.size
""")

class MyApp(App):
    def build(self):
        return KV

if __name__ == '__main__':
    MyApp().run()

1 Ответ

0 голосов
/ 22 января 2019

Проблема заключается в том, что в методе LittleButtons __init__() его позиция по-прежнему является значением по умолчанию (0,0), поэтому позиция Rectangle установлена ​​в (0,0).Когда вы используете KV, он умно связывает позицию Rectangle с позицией LittleButtons, когда вы ссылаетесь на self.pos.К сожалению, в файле .py вы должны предоставить эту привязку самостоятельно.Итак, вот модификация вашего LittleButtons, которая должна обрабатывать изменения позиции:

class LittleButtons(Button):

    dur = 2

    def reup(self, *args):

        Animation.cancel_all(self)
        Animation(pos_hint = {'center_x': random(), 'center_y': random()}, duration = self.dur).start(self)

    def __init__(self, **kwargs):
        self.rect = None
        super(LittleButtons, self).__init__(**kwargs)
        self.pos_hint = {'center_x': random(), 'center_y': random()}
        self.size_hint = None, None
        self.width = random() * (Window.width / 20)
        self.height = self.width
        self.background_color = [0,0,0,.05]
        with self.canvas:
            Color(rgba = [1,1,1,.2])
            self.rect = Rectangle(pos = self.pos, size = self.size)

        Animation(pos_hint = {'center_x': random(), 'center_y': random()}, duration = self.dur).start(self)
        Clock.schedule_interval(self.reup, self.dur)


    def on_pos(self, instance, pos):
        if self.rect is not None:
            self.rect.pos = pos

Изменения - это добавление атрибута self.rect и метода on_pos.

Вы можете добавить что-то подобное, если вам нужно справиться со сменой size.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...