Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Looping over widgets in Tkinter

here's the issue I'm thinking of:

I have a number of similar widgets in the frame(e.g. Lables). I update them every iteration of the algorithm (using root.update() in the relevant function. What I'd like to know, is how to loop through each Label.

Of course, they were created with something like

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

So each of the lables are named lab1,lab2, etc. I'm quite sure there should either be a better way of naming them, so that I don't have to call each name explicitly, or somehow loop though them.

like image 931
sigma.z.1980 Avatar asked Dec 17 '22 05:12

sigma.z.1980


1 Answers

Your consistant name scheme let you use the variable name to iterate through your variables:

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

You may also consider relying on Tkinter whom retain a tree structure of your widgets accessible through children widget attribute (a dictionary):

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

And eventually add some filtering if your frame contains other widgets. For instance, to filter on classes of widgets:

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

Note that children does not have any guarantee on order traversal. For such service, you may rely on geometry manager infos, ie pack_slaves or 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
like image 56
FabienAndre Avatar answered Dec 26 '22 23:12

FabienAndre