首页 > 解决方案 > 如何阻止 tkinter 画布小部件 / after 方法跳过列表中的元素?

问题描述

我正在尝试创建一条每秒更新的行。此更新需要显示在屏幕上,因此您应该能够在窗口中看到更改。例如,下面的每一行都应该在一秒钟后运行。

canvas.create_line(1, 2, 10, 20, smooth="true")
canvas.create_line(1, 2, 10, 20, 50, 60, smooth="true")
canvas.create_line(1, 2, 10, 20, 50, 60, 100, 110, smooth="true")

这是我到目前为止所拥有的:

def make_line(index):
    while index < len(database):
        x, y, z = database[index]
        # database is a list of tuples with numbers for coordinates
        coordinates.append(x) # coordinates is an empty list
        coordinates.append(y)
        #don't need z since 2D map
        index += 1
        if index == 2:
            # noinspection PyGlobalUndefined
            global line
            line = canvas.create_line(coordinates, smooth="true") 
            # same as canvas.create_line(1, 2, 10, 20, smooth="true")
        elif index > 2:
            canvas.after(1000, lambda: canvas.coords(line, coordinates))
            # it's jumping from the 1st to the 4th element
        else:
            pass

make_line(0)

我认为问题出在 canvas.after 方法和 canvas.coords 到它在 index = 3 时运行该行时,坐标已经有 1、2、10、20、50、60、100 和 110,而它应该只有 1、2、10、20、50 和 60。提前致谢。

标签: pythontkintertkinter-canvas

解决方案


我最终不得不将 while 循环移到函数之外并添加 root.update_idletasks() 和 root.update() 而不是 root.mainloop()。从这篇文章中,我了解到您的程序基本上会在 mainloop 停止,而更新将允许程序继续。这就是我最终的结果:

def add_coordinates(index):
    x, y, z = database[index]
    coordinates.append(x)  # coordinates is an empty list
    coordinates.append(y)
ind = 0 # ind means index
while ind < len(database):
    if ind < 2:
        add_coordinates(ind)
    elif ind == 2:
        trajectory = canvas.create_line(coordinates, smooth="true")
        add_coordinates(ind)
        canvas.after(1000)
    elif ind > 2:
        add_coordinates(ind)
        canvas.after(1000, canvas.coords(trajectory, coordinates))
    else:
        pass
    ind += 1
    root.update_idletasks()
    root.update()

当然,我在文件的开头有 import 语句,在文件的最后有 root.mainloop()。


推荐阅读