<Python - Kivy > 呈现单个 Tile 的 GridLayout

<Python - Kivy > GridLayout rendering a single Tile

我有以下 python classes:

import os

from kivy.uix.widget import Widget
from kivy.uix.gridlayout import GridLayout
from kivy.uix.image import Image

from crawler.settings import ASSETS_DIR


class Map(GridLayout):
    SIZE = 5

    def __init__(self, **kwargs):
        super(Map, self).__init__(**kwargs)
        for _ in range(0, self.SIZE**2):
            self.add_widget(Tile())


class Tile(Widget):
    def __init__(self, **kwargs):
        super(Tile, self).__init__(**kwargs)
        self.add_widget(Image(source=os.path.join(ASSETS_DIR, 'images/chest.gif')))

以及以下kv语言定义:

#:kivy 1.0.9

<Map>:
    size: self.parent.size

<Tile>:
    size: 20, 20

这只会渲染 1 个箱子(实际上循环运行正常,所以它们可能堆叠在一起?): 如果我为一些开箱即用的小部件(如按钮)更改 Tile class:

class Map(GridLayout):
SIZE = 5

def __init__(self, **kwargs):
    super(Map, self).__init__(**kwargs)
    for _ in range(0, self.SIZE**2):
        self.add_widget(Button(text=str(_)))

它显示正确的结果:

为了完成这项工作,我的 Tile class 缺少什么?我认为这就是问题所在,但目前我找不到它

class Tile(Widget):
    def __init__(self, **kwargs):
        super(Tile, self).__init__(**kwargs)
        self.add_widget(Image(source=os.path.join(ASSETS_DIR, 'images/chest.gif')))

每个 Tile 都是一个 Widget 包含 图片,但 Widget 不是布局 class 所以图片只有默认位置 (0, 0)(100, 100).

的大小

您可以将 Tile 设为 图像,或将 Widget 替换为类似 BoxLayout 的布局(后一种选择效率较低,除非您需要额外的布局行为)。