Looping over widgets in Tkinter

给你一囗甜甜゛ 提交于 2020-01-04 05:31:11

问题


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.


回答1:


The easiest way is to store references to each widget in a list or dictionary rather than (or in addition to) scaler instance variables.




回答2:


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


来源:https://stackoverflow.com/questions/8751434/looping-over-widgets-in-tkinter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!