循环在Tkinter的小部件

时间:2012-01-05 23:29:38

标签: python loops widget tkinter

这是我正在考虑的问题:

我在框架中有许多类似的小部件(例如Lables)。我在算法的每次迭代中更新它们(在相关函数中使用root.update()。我想知道的是如何遍历每个Label。

当然,它们是用

之类的东西创建的
self.var1=IntVar()
self.lab1=Label(frame,textvariable=self.var1)
self.lab1.grid() 

所以每个标签都被命名为lab1,lab2等。我很确定应该有更好的方法来命名它们,这样我就不必明确地调用每个名字,或以某种方式循环它们

2 个答案:

答案 0 :(得分:7)

您的一致名称方案允许您使用变量名来迭代变量:

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

您也可以考虑依赖Tkinter,他们通过children小部件属性(字典)保留您的小部件的树结构:

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_slavesgrid_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 :(得分:1)

最简单的方法是在列表或字典中存储对每个窗口小部件的引用,而不是(或除了)缩放器实例变量。