Мой вопрос связан с Python/Kivy. Мне нужно использовать различные текстуры для игровых блоков (т. Е. Квадратные поля, 40 x 40) в зависимости от их типов. Я попробовал самый естественный способ для меня, т. Е. Определить тип как атрибут объекта и проверить значение в .kv-файле. Увы, атрибут не распознается. Я почти уверен, что это что-то простое и в результате моего непонимания какой-то концепции. Stil Я не могу разобраться с доступными документами. Заранее благодарим за то, что поставили меня в правильном направлении.Как передать свойства объекта в файл Kivy .kv
Рассмотрим следующий пример кода. Это довольно большой кусок, но это затраты на его полную работу.
# Imports
from os import system as _system
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.graphics import Color
from kivy.properties import NumericProperty, ReferenceListProperty, ObjectProperty
from kivy.vector import Vector
from kivy.config import Config
from kivy.uix.image import Image
# Size of the map in memory
MAXX = 1001
MAXY = 150
# Size of the display, counted in blocks
MAXSCREENX = 91
MAXSCREENY = 60
# Single block size
BLOCK_SIZE = 40
# Global data structures
game_state = []
mapa = []
player_position = []
equipment = []
eye_direction = 0
# Various subclasees, because of different GIFs defined in the .ky file
class Block(Widget):
typ = NumericProperty(0)
class GameWidget(Widget):
xshift = NumericProperty(0)
yshift = NumericProperty(0)
class ExampleApp(App):
def build(self):
game = GameWidget()
game.xshift = 0
game.yshift = 0
game.screen_map = []
for i in range(MAXSCREENX):
for j in range(MAXSCREENY):
idx = i*MAXSCREENY + j
game.add_widget(Block(), idx)
game.children[idx].pos = (i * BLOCK_SIZE, j * BLOCK_SIZE)
game.children[idx].typ = 2
return game
if __name__ == '__main__':
# Set the window size
Config.set('graphics', 'width', str(MAXSCREENX * BLOCK_SIZE))
Config.set('graphics', 'height', str(MAXSCREENY * BLOCK_SIZE))
ExampleApp().run() # Launch the main application
с сопровождающим файлом example.kv:
#:kivy 1.9.0
<Block>:
size: 40, 40
canvas:
Rectangle:
if self.typ == 2:
source: "Textures/Dirt.png"
pos: self.pos
size: 40, 40
Увы, я получаю следующее сообщение об ошибке:
kivy.lang.ParserException: Parser: File "C:\Moje\Example\example.kv", line 7:
...
5: canvas:
6: Rectangle:
>> 7: if self.typ == 2:
8: source: "Textures/Dirt.png"
9: pos: self.pos
Спасибо. Теперь это говорит файл "C: \ Moje \ Пример \ example.kv", строка 7 "Текстуры/Dirt.png", если self.typ == 2 ^ SyntaxError: неожиданный конец файла во время разбора Где я могу найти синтаксическая ссылка? Я сделал попытку, но безуспешно. – tomekd
Используйте 'root.typ' вместо 'self.typ', поскольку вы имеете в виду свойство 'Block'. Ответ обновляется. – mcastle
Спасибо. Но это «неожиданный EOF при разборе». Я тщательно отредактировал файл .kv с помощью Блокнота, чтобы убедиться, что нет скрытых символов, поэтому я думаю, что это скорее какая-то проблема синтаксического анализа. Где я могу найти ссылку? – tomekd