Tkinter 使用循环从列表中放置小部件
Tkinter place widgets from a list using a loop
我正在尝试使用坐标列表在 window 上放置一堆标签。该循环生成一堆标签对象并将它们附加到列表中。但是,当我尝试从对象列表中读取并对其执行 运行 命令(pack()
或 place()
)时,屏幕上只会显示最后调用的标签。
root = Tkinter.Tk()
...
coordinates = [[25, 40], [410, 40], [650, 40],
[35, 180], [200, 180], [410, 180], [655, 180]]
labels = list()
interval = int()
message = "Hello, do you wanna push to master?".split(' ')
for index in range(len(coordinates)):
if coordinates[index][1] < 100:
labels.append(Tkinter.Label(root, text=message[index]))
else:
labels.append(Tkinter.Label(root, text=message[index]))
root.after(interval, lambda: labels[index].place(x=coordinates[index][0], y=coordinates[index][1]))
interval += 500
在上面的代码中,只有带有 "master?" 的标签会显示在屏幕上,尽管它以正确的样式出现在正确的坐标处。我可以通过使用 range(len(coordinates) - 1
、range(len(coordinates) - 2
等更改最后一个索引来显示不同的标签,但一次只能显示一个。请注意,如果我手动将它们分配给变量并在没有循环的情况下调用它们,所有标签都可以正常显示。
删除 root.after
并且只有这一行。
labels[index].place(x=coordinates[index][0], y=coordinates[index][1])
或者如果你真的想要延迟启动,那么删除 lambda
for
循环将引用分配给 index
而不是
中的值
lambda: labels[index].place(x=coordinates[index][0], y=coordinates[index][1])`
所以你需要lambda i=index:
lambda i=index: labels[i].place(x=coordinates[i][0], y=coordinates[i][1]))
我的版本
import Tkinter
coordinates = [[25, 40], [410, 40], [650, 40],
[35, 180], [200, 180], [410, 180], [655, 180]]
message = "Hello, do you wanna push to master?".split(' ')
labels = []
interval = 0
root = Tkinter.Tk()
root.geometry("750x210")
for (x,y), msg in zip(coordinates, message):
lab = Tkinter.Label(root, text=msg)
labels.append(lab)
root.after(interval, lambda a=x,b=y,l=lab:l.place(x=a, y=b))
interval += 500
root.mainloop()
我正在尝试使用坐标列表在 window 上放置一堆标签。该循环生成一堆标签对象并将它们附加到列表中。但是,当我尝试从对象列表中读取并对其执行 运行 命令(pack()
或 place()
)时,屏幕上只会显示最后调用的标签。
root = Tkinter.Tk()
...
coordinates = [[25, 40], [410, 40], [650, 40],
[35, 180], [200, 180], [410, 180], [655, 180]]
labels = list()
interval = int()
message = "Hello, do you wanna push to master?".split(' ')
for index in range(len(coordinates)):
if coordinates[index][1] < 100:
labels.append(Tkinter.Label(root, text=message[index]))
else:
labels.append(Tkinter.Label(root, text=message[index]))
root.after(interval, lambda: labels[index].place(x=coordinates[index][0], y=coordinates[index][1]))
interval += 500
在上面的代码中,只有带有 "master?" 的标签会显示在屏幕上,尽管它以正确的样式出现在正确的坐标处。我可以通过使用 range(len(coordinates) - 1
、range(len(coordinates) - 2
等更改最后一个索引来显示不同的标签,但一次只能显示一个。请注意,如果我手动将它们分配给变量并在没有循环的情况下调用它们,所有标签都可以正常显示。
删除 root.after
并且只有这一行。
labels[index].place(x=coordinates[index][0], y=coordinates[index][1])
或者如果你真的想要延迟启动,那么删除 lambda
for
循环将引用分配给 index
而不是
lambda: labels[index].place(x=coordinates[index][0], y=coordinates[index][1])`
所以你需要lambda i=index:
lambda i=index: labels[i].place(x=coordinates[i][0], y=coordinates[i][1]))
我的版本
import Tkinter
coordinates = [[25, 40], [410, 40], [650, 40],
[35, 180], [200, 180], [410, 180], [655, 180]]
message = "Hello, do you wanna push to master?".split(' ')
labels = []
interval = 0
root = Tkinter.Tk()
root.geometry("750x210")
for (x,y), msg in zip(coordinates, message):
lab = Tkinter.Label(root, text=msg)
labels.append(lab)
root.after(interval, lambda a=x,b=y,l=lab:l.place(x=a, y=b))
interval += 500
root.mainloop()