Python Tkinter动画序列的缓冲(可能)问题

Python Tkinter动画序列的缓冲(可能)问题,python,tkinter,Python,Tkinter,所以,我有一个使用Tkinter的小游戏应用程序 有一个包含图形的静态标签小部件,我可以以正常方式更新它(通常使用一个名为update_image的函数),一个播放器用于输入命令的文本输入(输入小部件),以及一个用于输出的文本框(文本小部件)(带有相关的输出函数)。有一个名为handlermain的函数用于获取输入,还有一个名为navigationmain的函数用于处理之后的大部分命令 我需要做的是让序列在几个位置移动,在这些位置我可以循环浏览几个图像,打印每个图像的相关文本,并暂停,而不是播放

所以,我有一个使用Tkinter的小游戏应用程序

有一个包含图形的静态标签小部件,我可以以正常方式更新它(通常使用一个名为update_image的函数),一个播放器用于输入命令的文本输入(输入小部件),以及一个用于输出的文本框(文本小部件)(带有相关的输出函数)。有一个名为handlermain的函数用于获取输入,还有一个名为navigationmain的函数用于处理之后的大部分命令

我需要做的是让序列在几个位置移动,在这些位置我可以循环浏览几个图像,打印每个图像的相关文本,并暂停,而不是播放器输入。为此,我尝试了两种方法:将sleep()调用放入navigationmain(因此尝试调用图像更新程序和文本输出,然后等待一秒钟,然后在下一轮中再次调用它们),并将after()调用放入update_image以将等待放入其中。在这两种情况下,tkinter只是循环所有延迟,然后在最后转储所有文本,跳到序列中的最后一个图像

我真的不明白为什么会发生这种情况,尽管我可能只是太过密集——我想一定有某种内置的缓冲系统在它完成之前阻止它更新

下面是我最近的一次尝试,使用root.after尝试实现延迟(这是navigationmain()函数中间的一个片段,它非常长,所以我不会给你全部内容)-这也做了同样的事情,只是在最后把它全部吐出来。“command”变量通常由player输入提供:这里的调用将其设置为“PLACEHOLDER”,这样函数就不会混淆,但在这些情况下,它并没有真正被使用。注意,app.update_image也在使用app.location查找要显示的图像

    elif app.location == 3: #Planet#
        if command == "LOOK":
            app.output ("You are on the planet PLANET. Your SHIP is here.")
        else:
            app.output ("Try saying something else!") 
    elif app.location == 38: #Travel to Planet#
        app.update_image()
        app.output ("Travel note 1")
        app.location = 380
        root.after(1000, navigationmain("PLACEHOLDER"))
    elif app.location == 380:
        app.update_image()
        app.output ("Travel note 2")
        app.location = 381
        root.after(1000, navigationmain("PLACEHOLDER"))
    elif app.location == 381:
        app.update_image()
        app.output ("Travel note 3")
        app.location = 382
        root.after(1000, navigationmain("PLACEHOLDER"))
    elif app.location == 382:
        app.update_image()
        app.output ("Travel note 4 and final")
        app.location = 3
        root.after(1000, navigationmain("PLACEHOLDER"))
我认为这一切都没有意义,但如果有任何意义的话,我们将不胜感激

缓冲仅仅是您进行更改(更改标签、更新图像、移动窗口等)与事件循环下一次能够处理事件(或手动调用
update
update\u idletasks
)之间的时间

在之后使用
,是一种安排时间间隔运行的方法。假设您在此期间没有运行其他代码,您应该不会看到延迟。但是,如果不给事件循环一个处理事件的机会,就会看到延迟

然而,“缓冲”问题可能与此无关。考虑下面的代码:

root.after(1000, navigationmain("PLACEHOLDER"))
在上面的代码中,您将立即调用
navigationmain(“占位符”)
,并将结果分配给
after
命令。无论它返回什么(可能
None
)都是在一秒钟内运行的

解决方法是如下调用:

root.after(1000, navigationmain, "PLACEHOLDER")

我想我不确定我还需要发布哪些信息-上面的块不是在循环中,而是在navigationmain函数中,这一切都是直接类似的(通过一堆app.location检查,如果…else语句)解决的,这是答案中提到的问题:虽然我的循环不是不确定的,我也在做同样的事情——传递函数的结果,而不是调用它。无论如何,谢谢你的帮助!