【问题标题】:Looping over widgets in Tkinter在 Tkinter 中循环小部件
【发布时间】:2012-01-05 23:29:38
【问题描述】:

这是我正在考虑的问题:

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

当然,它们是用类似的东西创建的

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

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

【问题讨论】:

    标签: python loops widget tkinter


    【解决方案1】:

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

    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
    

    请注意,children 对订单遍历没有任何保证。对于此类服务,您可以依赖几何管理器信息,即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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你的意思是list1=[self.var1,self.var2],然后循环遍历list1[list]