Сначала я укажу на ошибки вашего кода, 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, только если вы хотите разместить несколько виджетов вформа сетки, и в вашем случае это не то, что вы хотите.