2015-06-13 3 views
2

Мой вопрос связан с 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 

ответ

2

Вы неправильно с использованием выражений Python на языке кв. См. docs для правильного синтаксиса. В частности, вам необходимо переместить выражение if после source:

Rectangle: 
    source: "Textures/Dirt.png" if root.typ == 2 
    pos: self.pos 
    size: 40, 40 
+0

Спасибо. Теперь это говорит файл "C: \ Moje \ Пример \ example.kv", строка 7 "Текстуры/Dirt.png", если self.typ == 2 ^ SyntaxError: неожиданный конец файла во время разбора Где я могу найти синтаксическая ссылка? Я сделал попытку, но безуспешно. – tomekd

+0

Используйте 'root.typ' вместо 'self.typ', поскольку вы имеете в виду свойство 'Block'. Ответ обновляется. – mcastle

+0

Спасибо. Но это «неожиданный EOF при разборе». Я тщательно отредактировал файл .kv с помощью Блокнота, чтобы убедиться, что нет скрытых символов, поэтому я думаю, что это скорее какая-то проблема синтаксического анализа. Где я могу найти ссылку? – tomekd

Смежные вопросы