1

私は次の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 クラスに欠けているものは何ですか? そこが問題だと思いますが、今のところ見つけられませんでした

4

1 に答える 1

2
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 はImageを含むWidget ですが、Widget はレイアウト クラスではないため、Image のデフォルトの位置(0, 0)とサイズは(100, 100).

代わりに、TileImage にするか、Widget を BoxLayout のようなレイアウトに置き換えることができます (この後者の選択は、追加のレイアウト動作が必要でない限り効率が低下します)。

于 2016-08-07T14:58:26.190 に答える