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()
我目前正在大学攻读计算机科学预科课程,所以我是编程新手,我们正在做一个 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()