Cześć, kiedy uruchamiam mój kod, ma on pokazywać kształt prostokąta poruszający się w górę iw dół. Jednak mogę uzyskać kształt prostokąta tylko w trybie statycznym (bez ruchu). Jednak zgodnie z funkcją w klasie widżetu powinna działać. Każda pomoc zostanie doceniona!

Plik countdown.py

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.widget import Widget
from kivy.graphics import *
from kivy.clock import Clock
from kivy.uix.screenmanager import Screen, ScreenManager

class WindowManager(ScreenManager):
    pass

class GameWindow(Screen):
    def __init__(self, **kwargs):
        super(GameWindow, self).__init__(**kwargs)
        self.add_widget(Root())
        self.add_widget(Rect())


class Root(Widget):
    pass

class Rect(Widget):
    velocity = ListProperty([10, 2])

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

    def update(self, *args):

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


kys = Builder.load_file("countdown.kv")

class MyMainApp(App):
    def build(self):
        return kys

if __name__ == "__main__":
    MyMainApp().run()

Plik countdown.kv

WindowManager:
    GameWindow:

<GameWindow>:
    canvas:
        Color:
            rgba: 1, 0, 0, 1
        Rectangle:
            pos: self.pos
            size: (42,15)


    Rect:
        pos: 85, 100
0
Budaksesat2000 20 listopad 2019, 06:58

1 odpowiedź

Widżet ma niektóre z następujących cech:

  • Jeśli jesteś umieszczony jako dziecko innego Widget (Screen, Spinner, itp.), zajmie to tyle miejsca, ile możesz, ponieważ size_hint wynosi (1,1), w twoim przypadku zajmuje całą przestrzeń ekranu.

  • Nie można go odróżnić, ponieważ nie ma koloru tła ani innego elementu wizualnego.

Z powyższego wynika, że ​​nawet po przesunięciu "Rect", który jest widżetem, nie można tego odróżnić, więc musimy użyć płótna do jego malowania (przypuszczam, że to właśnie próbowałeś użyć podczas korzystania z płótna w GameWindow), oprócz ustawić rozmiar niezależny od kontenera należy ustawić size_hint na (Brak, Brak).

Biorąc pod uwagę powyższe, rozwiązaniem jest:

from kivy.app import App
from kivy.lang import Builder
from kivy.properties import ListProperty
from kivy.uix.widget import Widget
from kivy.clock import Clock
from kivy.uix.screenmanager import Screen, ScreenManager


class WindowManager(ScreenManager):
    pass


class GameWindow(Screen):
    pass


class Rect(Widget):
    velocity = ListProperty([10, 2])

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

    def update(self, *args):
        self.y += self.velocity[1]
        if self.y < 0 or (self.y + self.height) > 250:
            self.velocity[1] *= -1


kys = Builder.load_file("countdown.kv")


class MyMainApp(App):
    def build(self):
        return kys


if __name__ == "__main__":
    MyMainApp().run()
WindowManager:
    GameWindow:

<GameWindow>:
    Rect:

<Rect>:
    size_hint : None, None
    size : 42, 15
    canvas:
        Color:
            rgba: 1, 0, 0, 1
        Rectangle:
            pos: self.pos
            size: self.size
1
eyllanesc 20 listopad 2019, 07:14