Киви двигает виджет - PullRequest
0 голосов
/ 22 мая 2019

Невозможно переместить виджет с помощью Kivy

Я хочу переместить прямоугольник и следовал коду, используемому в youtube (ускоренный курс kivy 11 от Александра Тейлора).После кода прямоугольник появляется на экране, но не перемещается

код питона

class CRect:
    velocity = ListProperty([20, 10])

    def __init__(self, **kwargs):
        super(CRect, self).__init__(**kwargs)
        Clock.schedule_interval(self.update, 1/60)

    def update(self):
        self.x += self.velocity[0]
        self.y += self.velocity[1]

        if self.x < 0 or (self.x+self.width) > Window.width:
            self.velocity[0] *= -1

        if self.y < 0 or (self.y+self.height) > Window.height:
            self.velocity[1] *= -1


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

код kv

<DemoCreator>:
    CRect:

        canvas:
            Color:
                rgba: 1,0,0,1
            Rectangle:
                pos: 100,0
                size: 40,40

<CRect@Widget>

Нет сообщений об ошибках.Но не может переместить виджет

1 Ответ

0 голосов
/ 22 мая 2019

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

from kivy.uix.widget import Widget
from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.clock import Clock
from kivy.core.window import Window

KV = """

CRect:
    canvas:
        Color:
            rgba: 1,0,0,1
        Rectangle:
            pos: 100,0
            size: 40,40


"""

class CRect(Widget):
    velocity = ListProperty([20, 10])
    rect_x, rect_y = 0, 0

    def __init__(self, **kwargs):
        super(CRect, self).__init__(**kwargs)
        Clock.schedule_interval(self.update, 1/60)

    def update(self, dt):
        rect = self.canvas.children[-1]
        self.rect_x += self.velocity[0]
        self.rect_y += self.velocity[1]

        rect.pos = self.rect_x, self.rect_y

        if self.rect_x < 0 or (self.rect_x+rect.size[0]) > Window.width:
            self.velocity[0] *= -1

        if self.rect_y < 0 or (self.rect_y+rect.size[1]) > Window.height:
            self.velocity[1] *= -1


class MyApp(App):
    def build(self):
        return Builder.load_string(KV)

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