简体   繁体   中英

How to stop flickering when using the clear() function in turtle graphics

I am writing a program for an exercise that simulates a projectile launch while tracking down every x and y position per second.

While the program technically works, and it does track down every x and y position, the text that tracks down the x and y position flickers for each step.

I understand the problem is that I am using the .clear() function (which, as its name implies, clears the text generated by the turtle). However, I believe that the program only functions properly with it.

Here is my code:

"""Program to track specific location of turtle (for every step)"""

from turtle import *
from math import *

def cball_graphics():

    leonardo = Turtle()
    leonardo.color("dark blue")
    leonardo.shape("turtle")
    leonardo.speed(1)

    return leonardo

def show_position():

    pos = Turtle()
    pos.color("white")
    pos.goto(30, -50)
    pos.color("red")

    return pos

class cannon_ball:

    def __init__(self, angle, vel, height, time):

        self.x_pos = 0
        self.y_pos = height
        theta = pi * angle / 180
        self.x_vel = vel * cos(theta)
        self.y_vel = vel * sin(theta)
        self.time = time

    def update_time(self):

        self.x_pos += self.time * self.x_vel
        y_vel1 = self.y_vel - 9.8 * self.time
        self.y_pos += self.time * (self.y_vel + y_vel1) / 2
        self.y_vel = y_vel1

    def get_x(self):

        return self.x_pos

    def get_y(self):

        return self.y_pos

def variables():

    angle = 55
    vel = 10
    height = 100
    time = .01

    return cannon_ball(angle, vel, height, time)

def main():

    leonardo = cball_graphics()

    """pos is a variable that writes the position on the screen using x and y pos"""
    pos = show_position()
    pos.hideturtle()
    projectile = variables()

    while projectile.y_pos >= 0:

        pos.write(f"{'%0.0f' % projectile.x_pos}, {'%0.0f' % projectile.y_pos}")

        projectile.update_time()
        leonardo.goto(projectile.x_pos, projectile.y_pos)

        pos.clear()

main()

I believe that the tracer() and update() methods of the turtle screen will solve your problem. They allow you to write to the backing store and then copy it to the screen once it's the way you want. Particularly useful for eliminating flicker:

from turtle import Screen, Turtle
from math import pi, sin, cos

FONT = ('Arial', 18, 'normal')

def cball_graphics():

    leonardo = Turtle()
    leonardo.color('dark blue')
    leonardo.shape('turtle')

    return leonardo

def show_position():

    pos = Turtle()
    pos.hideturtle()
    pos.goto(30, -50)
    pos.color('red')

    return pos

class cannon_ball:

    def __init__(self, angle, velocity, height, time):

        self.x_pos = 0
        self.y_pos = height

        theta = pi * angle / 180

        self.x_vel = velocity * cos(theta)
        self.y_vel = velocity * sin(theta)

        self.time = time

    def update_time(self):

        self.x_pos += self.time * self.x_vel
        y_vel1 = self.y_vel - 9.8 * self.time
        self.y_pos += self.time * (self.y_vel + y_vel1) / 2
        self.y_vel = y_vel1

def freefall():

    if projectile.y_pos >= 0:

        pos.clear()
        pos.write("({:0.0f}, {:0.0f})".format(projectile.x_pos, projectile.y_pos), font=FONT)

        projectile.update_time()

        leonardo.goto(projectile.x_pos, projectile.y_pos)

        screen.update()
        screen.ontimer(freefall)

variables = {
    'angle': 55,
    'velocity': 10,
    'height': 100,
    'time': 0.01,
}

screen = Screen()
screen.tracer(False)

leonardo = cball_graphics()

# pos is a turtle that writes the position on the screen using x and y pos
pos = show_position()

projectile = cannon_ball(**variables)

freefall()

screen.mainloop()

I also made several style changes to the code while I was at it...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM