Цикл над виджетами в Tkinter - PullRequest
0 голосов
/ 06 января 2012

вот проблема, о которой я думаю:

У меня есть несколько похожих виджетов в кадре (например, Lables). Я обновляю их на каждой итерации алгоритма (используя root.update() в соответствующей функции. Что я хотел бы знать, так это как пройти по каждой метке.

Конечно, они были созданы с чем-то вроде

self.var1=IntVar()
self.lab1=Label(frame,textvariable=self.var1)
self.lab1.grid() 

Таким образом, каждая из меток называется lab1, lab2 и т. Д. Я совершенно уверен, что должен быть лучший способ присвоения им имен, чтобы мне не приходилось явно называть каждое имя, или каким-то образом зацикливать их .

Ответы [ 2 ]

7 голосов
/ 09 января 2012

Ваша постоянная схема имен позволяет вам использовать имя переменной для перебора ваших переменных:

for i in range(1,n):
    label = getattr(self, "lab"+str(i))

Вы можете также рассмотреть возможность использования Tkinter, который сохраняет древовидную структуру ваших виджетов, доступную через атрибут children widget(словарь):

for child in frame.children.values():
    #do something to all children

И, в конце концов, добавьте некоторую фильтрацию, если ваш фрейм содержит другие виджеты.Например, для фильтрации по классам виджетов:

for label in filter(lambda w:isinstance(w,Label), frame.children.itervalues()):
    #do something on labels

Обратите внимание, что дочерние элементы не имеют никакой гарантии на обход заказа.Для такой услуги вы можете полагаться на информацию о менеджере геометрии, например pack_slaves или grid_slaves:

for child in frame.pack_slaves():
    #traverse in pack addition order
#or
for child in reversed(frame.grid_slaves()):
    #traverse in grid addition order
1 голос
/ 06 января 2012

Самый простой способ - хранить ссылки на каждый виджет в списке или словаре, а не (или в дополнение к) переменным экземпляра масштабатора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...