如何在Kivy中使用Atlas对象?

时间:2016-12-21 15:19:22

标签: python python-3.x kivy

我知道通过atlas://网址表示法可以使用地图集文件。这就是我们可以使用的代替文件名来应用地图集中的纹理。但是atlas模块中的文档中还有另一部分,其中显示了创建实际Atlas对象的方式,其中包含.atlas文件的路径:

atl = Atlas('path/to/atlas')

然后我们可以对该对象执行纹理查找。根据我的期望,以下声明被认为是有效的:

Button(background_normal = atl['some_texture'])

但显然Atlas对象上的查找会返回TextureRegion,而不能使用atlas://代替背景文件名。

我不坚持.format符号的原因是我希望我的应用程序有多个主题。构建" URL"对于每个纹理(Atlas或字符串连接)似乎是一个非常糟糕的解决方案,所以我想知道我是否可以使用class TextureResolver: def __init__(self, atlas_path): # atlas_path should be given without '.atlas' self.atlas_path = 'atlas://' + atlas_path + '/' def __getitem__(self, key): return self.atlas_path + key 个对象来实现我的目标。

当前解决方法:创建一个自动构造给定纹理名称的URL的对象

<?php
/**
 * @param string $url
 * @param array  $rewrites
 *
 * @return array
 */
function get_info(string $url, array $rewrites): array
{
    $patterns = [
        'original' => [],
        'named' => [],
    ];
    foreach (array_keys($rewrites) as $key => $pattern) {
        $index = "pattern_{$key}";
        $patterns ['original'][$index] = $pattern;
        $patterns ['named'][$index] = "(?P<{$index}>{$pattern})";
    }

    $patternsString = '#(' . implode('|', $patterns['named']) . ')#';

    $matches = [];
    preg_match_all($patternsString, $url, $matches);

    $matchedPatterns = [];
    if (count($matches) > 0) {
        foreach ($matches as $key => $match) {
            if (key_exists($key, $patterns['named']) 
                && count($match) > 0
                && !empty($match[0])) {
                $matchedPatterns [] = $rewrites[$patterns['original'][$key]];
            }
        }
    }

    return $matchedPatterns;
}

$rewrites = [
    'item[0-9].html' => ['target' => 'http://example.com'],
    '-item.html' => ['target' => 'http://example1.com'],
];

$testData = [
    'item1.html' => [['target' => 'http://example.com']],
    '-item.html' => [['target' => 'http://example1.com']],
];   

foreach ($testData as $key => $datum) {
    $output = get_info($key, $rewrites);
    assert($datum == $output, sprintf("\"%s\" has wrong matches.", $key));
}

1 个答案:

答案 0 :(得分:-1)

import os
path = os.path.dirname(__file__)
atlas_path = os.path.join(path, 'atlas/')
Atlas('{}key.atlas'.format(atlas_path))