Kivy Widget не двигается - PullRequest
       9

Kivy Widget не двигается

0 голосов
/ 17 февраля 2019

Когда программа запускается, ScreenManager показывает главный экран, на котором я добавил маленький белый square(Ball).

Виджет Ball должен двигаться, но я не могу понять, почему он все еще статичен.Метод обновления работает, но позиция виджета не обновляется.Я пытался изменить положение вещей, но безрезультатно.

Если бы кто-то мог помочь мне понять, в чем я не прав, было бы здорово.Огромное спасибо.

import kivy
kivy.require('1.10.1')
from kivy.app import App
from kivy.core.window  import Window
from kivy.uix.screenmanager import ScreenManager,Screen
from kivy.graphics import Rectangle
from kivy.uix.widget import Widget
from kivy.properties import ListProperty
from kivy.clock import Clock

# simple Screen on which the ball should move
class Main(Screen):
    def __init__(self, **kwargs):
        super(Main, self).__init__(**kwargs)
        self.add_widget(Ball())
        with self.canvas.before:
            Rectangle(source = 'BG1.png',
                      size = Window.size,
                      pos = self.pos)

# the Ball should be bouncing around
class Ball(Widget):
    velocity = ListProperty([10, 15])
    def __init__(self, **kwargs):
        super(Ball, self).__init__(**kwargs)
        Clock.schedule_interval (self.update, 1 / 60)

        with self.canvas:
            Rectangle (color=[0, 0, 0, 1],
                       size=(10, 10),
                       pos = self.pos)

    def update(self, *args):
        print('wtf')
        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

Window.size = (400, 300)
sm = ScreenManager()
sm.add_widget(Main(name = 'main'))

class Bubble(App):
    def build(self):
        return sm

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

Ответы [ 3 ]

0 голосов
/ 17 февраля 2019

Проблема в том, что когда вы устанавливаете Canvas инструкции в python (а не в kv), вы не получаете автоматические привязки, которые kv делает для вас.Таким образом, Rectangle, который вы определяете в методе Ball.__init__(), получает pos, определенный как pos Ball в его __init__() момент (который равен [0,0]), и это неизменить автоматически.Вы можете исправить это, выполнив обновление самостоятельно.Во-первых, в вашем Ball.__init__() измените свой блок with self.canvas на:

    with self.canvas:
        Color(0,0,0,1)
        self.rect = Rectangle (size=(10, 10),
                   pos = self.pos)

Одно изменение определяет Color, а второе создает ссылку на Rectangle.Затем в вашем методе обновления добавьте строку:

self.rect.pos = self.pos

Это переместит прямоугольник с положением шара.

Кроме того, у вашего update метода есть некоторые проблемы, потому что size изBall соответствует размеру Window.Это не size, который вы предоставляете в Rectangle.

0 голосов
/ 18 февраля 2019

Спасибо, Эмбрио и Джон, ваши ответы привели меня к поиску правильного ответа.Я нашел этот код в этом блоге.Решил все это: Kivy blog

from kivy.uix.widget import Widget
from kivy.graphics import Rectangle, Color

class CornerRectangleWidget(Widget)
    def __init__(self, **kwargs):
        super(CornerRectangleWidget, self).__init__(**kwargs)

        with self.canvas:
            Color(1, 0, 0, 1)  # set the colour to red
            self.rect = Rectangle(pos=self.center,
                                  size=(self.width/2.,
                                        self.height/2.))

        self.bind(pos=self.update_rect,
                  size=self.update_rect)

    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size
0 голосов
/ 17 февраля 2019

Ну, что происходит, это ...

Вы рисуете прямоугольник один раз, когда создаете экземпляр виджета Ball.
Это то, что вы видите в левом нижнем углу.
После этого вы перемещаете виджет, но не рисуете его снова.

Если вы print(self.pos) в функции обновления, вы увидите, что он движется ...

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