Можно ли использовать подстановочные знаки с tkinter Canvas '.find_withtag'? - PullRequest
0 голосов
/ 28 марта 2020

Мне нужно запустить для l oop, который выполняет ту же функцию для всех элементов с определенной подстрокой. Я попытался:

for i in range(len(self.canvas.find_withtag('*label*')):
    #do this

с намерением, что если у меня будет три элемента с тегами label0, label1 и label2, for l oop будет выполняться три раза. Как лучше всего это сделать?

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020

Как @Bryan Oakley уже указал в своем ответе, в tkinter нет ничего встроенного, что бы делало то, что вы хотите - но, к счастью, довольно легко создать свою собственную функцию с этой функциональностью. В приведенном ниже примере представлены те же простые символы подстановки в стиле оболочки, которые поддерживаются модулем fnmatch для имен файлов.

Вот что я имею в виду:

from fnmatch import fnmatch

def find_withtag(canvas, pattern):
    """ Returns a list of the object IDs of the object or objects that match the
        pattern given. Supports shell-style wildcards characters "*" and "?".
    """
    ids = []
    for id in canvas.find_all():
        if any(fnmatch(tag, pattern) for tag in canvas.gettags(id)):
            ids.append(id)
    return ids
0 голосов
/ 28 марта 2020

Можно ли использовать символы подстановки с tkinter Canvas '.find_withtag'?

Нет, вы не можете использовать символы подстановки.

Необходимо указать идентификатор объекта, тег или логическое выражение тегов и идентификаторов. Вот какова каноническая документация о том, как указывать теги:

При указании элементов в командах виджета canvas, если спецификатор является целым числом, предполагается, что он ссылается на один элемент с этим идентификатором. Если спецификатор не является целым числом, предполагается, что он ссылается на все элементы холста, которые имеют тег, соответствующий спецификатору. Символ tagOrId используется ниже, чтобы указать, что аргумент указывает либо идентификатор, который выбирает один элемент, либо тег, который выбирает ноль или более элементов.

tagOrId может содержать логические выражения тегов используя операторы: « && », « || », « ^ », «! » и заключенные в скобки подвыражения. Например:

.c find withtag {(a&&!b)||(!a&&b)}

или эквивалентно:

.c find withtag {a^b}

найдет только те элементы, которые имеют «a» или «b» теги, но не оба.

...