tkinter 弹跳球

tkinter bouncing ball

我目前正在大学攻读计算机科学预科课程,所以我是编程新手,我们正在做一个 python 单元,我正在做课程内容之外的自己的项目。

我一直在尝试使用 Tkinter 制作弹跳球动画。但是我有两个球,红色和绿色,由于某种原因,它们在弹跳之前似乎没有触及 canvas 的顶部或左侧,并且与边缘的距离似乎不断增加。

from tkinter import *
import random
import time


root = Tk()

def balls():
    #speeds
    xspeed = 5
    yspeed = 3

    canvas = Canvas(root, width = 1000, height = 1000, bg="grey")
    root.title("collision detection")
    canvas.grid()

    greenBall = canvas.create_oval(5, 5, 35, 35, fill="green")
    redBall = canvas.create_oval(970, 970, 1000, 1000, fill="red")

    while True:
        #greenball
        canvas.move(greenBall, xspeed, yspeed)
        posgreen = canvas.coords(greenBall)

        if posgreen[3] >= 1000 or posgreen[1] <= 0:
            yspeed = -yspeed
        if posgreen[2] >= 1000 or posgreen[0] <= 0:
            xspeed = -xspeed

        #redball
        canvas.move(redBall, -xspeed, -yspeed)
        posred = canvas.coords(redBall)
        if posred[3] >= 1000 or posred[1] <= 0:
            yspeed = -yspeed
        if posred[2] >= 1000 or posred[0] <= 0:
            xspeed = -xspeed

        root.update()
        time.sleep(0.01)
        pass

balls()

root.mainloop()

我在 YouTube 上看过人们展示如何执行此操作的视频,他们似乎以相同的方式编码,但没有这个问题。

我对你的代码做了一些修改。问题出在速度定义中,在您的代码中,速度全局更改了 2 次,而不是每次针对每个球更改一次。 给你:

from tkinter import *
import time

root = Tk()


def balls():
    # define speed for each ball
    green_x_speed, green_y_speed = [5,3]
    red_x_speed, red_y_speed = [5,3]

    canvas = Canvas(root, width=800, height=800, bg="grey")
    root.title("collision detection")
    canvas.grid()

    green_ball = canvas.create_oval(20, 20, 30, 10, fill="green")
    red_ball = canvas.create_oval(780, 780, 790, 790, fill="red")

    while True:
        # green ball
        canvas.move(green_ball, green_x_speed, green_y_speed)
        green_coordinates = canvas.coords(green_ball)
        if green_coordinates[3] >= 800 or green_coordinates[1] <= 0:
            green_y_speed = -green_y_speed
        if green_coordinates[2] >= 800 or green_coordinates[0] <= 0:
            green_x_speed = -green_x_speed

        # red ball
        canvas.move(red_ball, red_x_speed, red_y_speed)
        red_coordinates = canvas.coords(red_ball)
        if red_coordinates[3] >= 800 or red_coordinates[1] <= 0:
            red_y_speed = -red_y_speed
        if red_coordinates[2] >= 800 or red_coordinates[0] <= 0:
            red_x_speed = -red_x_speed

        time.sleep(0.01)
        root.update()

balls()
root.mainloop()