ткинтер прыгающий мяч - PullRequest
1 голос
/ 30 января 2020

В настоящее время я изучаю информатику в университете и учусь на первом курсе, поэтому я новичок в программировании, у нас есть python модуль, и я делаю свой собственный проект вне содержания курса.

Я пытался сделать анимацию прыгающего мяча, используя Tkinter. Однако у меня есть два шара, красный и зеленый, по некоторым причинам они не касаются верхней или левой стороны холста перед подпрыгиванием, и расстояние от края, кажется, постоянно увеличивается.

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 видео людей, показывающих, как это сделать, и они, кажется, кодируют это так же, но у них нет этой проблемы.

1 Ответ

1 голос
/ 30 января 2020

Я сделал некоторые изменения в вашем коде. Проблема была в определении скорости, у вас скорость кода изменяется глобально 2 раза, а не каждый раз для каждого шара. Вот вам go:

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()
...