擅长:python、mysql、java
<p>画布刷新的唯一方法是事件循环为“重画”事件提供服务。在您的循环中,您永远不会给事件循环更新的机会,因此您看不到任何更改。</p>
<p>快速的解决方法是调用<code>self.canvas.update_idletasks</code>,但这只是一个技巧,不是一个正确的解决方案。</p>
<p>制作动画的正确方法是使用事件循环进行迭代。您可以通过将要完成的工作放在队列上来完成这项工作——在本例中,是空闲事件队列。您可以使用<code>after</code>命令将内容放置在此队列中。</p>
<p>你应该做的是编写一个函数来完成动画的一次迭代。本质上,把while循环中的所有内容都移到一个函数中。然后,只要有工作要做,就安排不断调用该函数。可以将对<code>after</code>的调用放在该函数中,也可以使用单独的函数控制动画。</p>
<p>粗略地说,解决方案如下:</p>
<pre><code>def do_one_frame(self, ...):
# do whatever you need to draw one frame
if (there_is_more_work_to_be_done):
self.after(10, do_one_frame)
</code></pre>
<p>这将绘制动画的一帧,检查是否有新的帧要绘制,然后安排下一帧在10毫秒内绘制。当然,可以将该值设置为所需的任何值,以控制动画的速度。</p>
<p>在这个网站上有这种技术的工作实例。例如,请参见<a href="https://stackoverflow.com/a/25431690/7432">https://stackoverflow.com/a/25431690/7432</a></p>