Я не могу заставить свой kivy виджет начать с позиции и двигаться - PullRequest
0 голосов
/ 24 августа 2018

Я новичок в kivy и не могу запустить этот виджет с определенной позиции, прежде чем он начнет двигаться. В моем файле kv мое положение виджета установлено на self.pos, а в моей функции fall я использую self.pos, чтобы изменить положение виджета и заставить его упасть. Единственная проблема заключается в том, что я не могу добавить исходную позицию для своего виджета. Вот мой код:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.graphics import Line
from kivy import Config
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.properties import NumericProperty, 
ReferenceListProperty,ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
Config.set('graphics', 'multisamples', '0')

class TetrisGame(GridLayout):
    block1= ObjectProperty(None)



class Block1(Widget):
    vel_x = NumericProperty(0)
    vel_y = NumericProperty(-1)
    position = ReferenceListProperty(vel_x,vel_y)
    def fall(self, pos):
        self.pos =  Vector(self.position) + self.pos

class TetrisApp(App):
    def build(self):
        game = TetrisGame()
        block = Block1()
        Clock.schedule_interval(block.fall, 1/60)
        return block

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

И .kv:

<Block1>:
canvas:
    Rectangle:
        size: root.width/5, root.height/20
        pos: self.pos

Как я могу исправить эту проблему?

Ответы [ 2 ]

0 голосов
/ 24 августа 2018

Сначала я укажу на ошибки вашего кода, TetrisGame - это бесполезный класс, потому что в вашем случае вы назначаете его только локальной переменной: game = TetrisGame(), он будет удален, когда вы закончите build() С другой стороны, блок возвращается так, что его область действия увеличивается.

Другая возможная ошибка заключается в том, что вы думаете, что при вводе:

size: root.width / 5, root.height/20 

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

Переходя к основной проблеме, позиция в kivy в отличие от соглашения относительно нижней левой точки, и вверх - y +, а для правой x +.

Решение состоит в том, чтобы получить размер окна, используя Window.

*. Py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy import Config
from kivy.properties import NumericProperty, ReferenceListProperty
from kivy.vector import Vector
from kivy.clock import Clock
from kivy.core.window import Window


Config.set('graphics', 'multisamples', '0')


class Block1(Widget):
    vel_x = NumericProperty(0)
    vel_y = NumericProperty(-1)
    position = ReferenceListProperty(vel_x,vel_y)
    def fall(self, _):
        self.pos =  Vector(self.position) + self.pos

class BackGround(Widget):
    pass

class TetrisApp(App):
    def build(self):
        background = BackGround()
        block = Block1(pos=(0, Window.height), size=(Window.width/4, Window.height/20))
        background.add_widget(block)
        Clock.schedule_interval(block.fall, 1/60)
        return background

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

*. Kv

<Block1>:
    canvas:
        Rectangle:
            size: root.size
            pos: self.pos

Примечание:

Вы не должны использовать GridLayout , вы должны использовать GridLayout, только если вы хотите разместить несколько виджетов вформа сетки, и в вашем случае это не то, что вы хотите.

0 голосов
/ 24 августа 2018

Python code

  1. Добавить операторы импорта: from kivy.graphics import Rectangle и from kivy.core.window import Window
  2. Установить начальную позицию для блока, block = Block1(pos=(0, Window.height))
  3. Добавитьблок для корневого виджета, game.add_widget(block)
  4. Возврат корневого виджета, return game
  5. Реализация методов для обновления или удаления инструкций, добавленных на холст
  6. Добавитьdt (дельта-время) в качестве аргумента метода fall().

Примечание

Если dt (delta-time) нет в списке аргументов, мы встретимся,

TypeError: fall() takes 1 positional argument but 2 were given.

Поэтому, когда мы планируем функцию, используя Часы Kivy , мы должны включать dt в качестве аргумента.

Если мы хотим запланировать функцию, которая не принимает аргумент dt, мы можем использовать лямбда-выражение, чтобы написать короткую функцию, которая не принимает dt.

kv file

  1. Придайте цвет блоку

Пример

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy import Config
from kivy.properties import NumericProperty, ReferenceListProperty,ObjectProperty
from kivy.vector import Vector
from kivy.clock import Clock
Config.set('graphics', 'multisamples', '0')

from kivy.graphics import Rectangle
from kivy.core.window import Window


class TetrisGame(GridLayout):
    block1 = ObjectProperty(None)


class Block1(Widget):
    vel_x = NumericProperty(0)
    vel_y = NumericProperty(-1)
    position = ReferenceListProperty(vel_x,vel_y)

    def __init__(self, **kwargs):
        super(Block1, self).__init__(**kwargs)
        with self.canvas:
            self.rect = Rectangle(pos=self.pos, size=self.size)

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

    def update_rect(self, *args):
        self.rect.pos = self.pos
        self.rect.size = self.size

    def fall(self, dt):
        self.pos = Vector(self.position) + self.pos


class TetrisApp(App):

    def build(self):
        game = TetrisGame()
        block = Block1(pos=(0, Window.height))
        game.add_widget(block)
        Clock.schedule_interval(block.fall, 1/60)
        return game


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

tetris.kv

#:kivy 1.11.0

<Block1>:
    canvas:
        Color:
            rgba: 1, 0, 0, 1    # red color block
        Rectangle:
            size: root.width/5, root.height/20
            pos: self.pos

Выход

Img01 Img02 Img03

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