root.after导致Tkinter应用程序停止工作

-1 投票
1 回答
539 浏览
提问于 2025-04-16 19:25
    def colision(self):
        if self.coords(self.bola)[1]<50:
            self.boladir=1
        if self.coords(self.bola)[1]>870:
            self.jugando=0
            self.pierde()
#        ladrillos=self.find_withtag("brick")

    def mueve_bola(self):
        if self.jugando:
            if self.boladir==0:
                    self.move(self.bola,0,-10)
            elif self.boladir==1:
                    self.move(self.bola,0,10)
        self.colision()
        root.after(velocidad_bola,self.mueve_bola)

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

1 个回答

1

colision这个函数通过after自己调用,所以当游戏开始时,它每20毫秒就会被调用一次。mueve_bola也每20毫秒调用一次。不过,mueve_bola也会调用colision。所以,每20毫秒,colision就会不断地自己调用自己。20毫秒后,mueve_bola又会调用colision,这又会开始一波新的调用,每20毫秒一次。仅仅过了一秒钟,colision就会被调用50次,每20毫秒一次。再过两秒,它每20毫秒就会被调用100次。你能明白这个问题吗?在很短的时间内,colision每秒就会被调用上百万次。

其实你只需要在移动物体的时候计算碰撞,所以没有必要让colision每20毫秒自己调用一次。每次更新显示的时候只需要调用一次就可以了。

我建议你创建一个每40毫秒调用一次的方法。在这个方法里,你可以一次性调整所有东西的坐标。先更新行的坐标,然后是玩家的挡板,再然后是球,最后检查碰撞。

撰写回答