【问题标题】:<Python - Kivy > GridLayout rendering a single Tile<Python - Kivy > GridLayout 渲染单个 Tile
【发布时间】:2016-08-07 14:50:54
【问题描述】:

我有以下 python 类:

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 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 课程中缺少什么来完成这项工作?我认为这就是问题所在,但到目前为止我找不到它

【问题讨论】:

    标签: python kivy kivy-language


    【解决方案1】:
    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包含一个 Image,但 Widget 不是布局类,因此 Image 仅具有 (0, 0) 的默认位置和 (100, 100) 的大小。

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

    【讨论】:

    • 确实有道理,让我试试
    猜你喜欢
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多