Animasi penyu sangat cepat dengan python

Saya membuat kincir angin tetapi bergerak sangat cepat. Saya menggunakan perpustakaan penyu untuk melakukan itu dan t2 hanya untuk lingkaran, t melakukan pekerjaan utama. Saya menggunakan tracer/update dan saya mencoba beberapa nomor di dalam tracer tetapi tidak ada yang berubah. Bagaimana saya bisa melakukan animasi itu dengan kecepatan normal?

import turtle
screen = turtle.Screen()
screen.tracer(0)         
t2 = turtle.Turtle()
t2.speed(2)
t2.forward(50)
t2.setheading(90)
t2.circle(50)
t = turtle.Turtle()
t.speed(2)
def rectangle() :
    t.penup()
    t.forward(170)
    t.left(90)
    t.pendown()
    t.forward(5)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(10)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(5)
def windmill():
    for i in range(4):
        rectangle()
        t.penup()
        t.goto(0,0)
        t.pendown()
while True:
    t.clear()
    windmill()
    screen.update()
    t.left(10)

person Yok Artık    schedule 11.01.2021    source sumber
comment
Memastikan setiap frame membutuhkan waktu yang tetap (misalnya 1/60 detik, yaitu 60fps) tidaklah mudah. Namun dalam kasus sederhana Anda dapat menempatkan time.sleep(t) di antara setiap gerakan. Apa pun yang terjadi, Anda memerlukan suatu bentuk pengukuran waktu nyata agar kecepatan CPU tidak bergantung pada apa pun.   -  person freakish    schedule 11.01.2021
comment
@aneh jadi ya, waktu berjalan sesuai keinginan saya. Jadi, saya tidak ada hubungannya dengan pelacak dan pembaruan pada saat itu?   -  person Yok Artık    schedule 11.01.2021


Jawaban (2)


Anda dapat menggunakan metode sleep dari modul time bawaan:

import turtle
from time import sleep # Imported here

screen = turtle.Screen()
screen.tracer(0)         
t2 = turtle.Turtle()
t2.forward(50)
t2.setheading(90)
t2.circle(50)
t = turtle.Turtle()
def rectangle() :
    t.penup()
    t.forward(170)
    t.left(90)
    t.pendown()
    t.forward(5)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(10)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(5)
def windmill():
    for i in range(4):
        rectangle()
        t.penup()
        t.goto(0,0)
        t.pendown()
while True:
    sleep(0.05) # Used here
    t.clear()
    windmill()
    screen.update()
    t.left(10)

Cara yang lebih lancar adalah dengan mengurangi jumlah left untuk setiap iterasi dari perulangan while:

import turtle

screen = turtle.Screen()
screen.tracer(0)         
t2 = turtle.Turtle()
t2.forward(50)
t2.setheading(90)
t2.circle(50)
t2.speed(2)
t = turtle.Turtle()
t.speed(2)
def rectangle() :
    t.penup()
    t.forward(170)
    t.left(90)
    t.pendown()
    t.forward(5)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(10)
    t.left(90)
    t.forward(120)
    t.left(90)
    t.forward(5)
def windmill():
    for i in range(4):
        rectangle()
        t.penup()
        t.goto(0,0)
        t.pendown()
while True:
    t.clear()
    windmill()
    screen.update()
    t.left(0.2) # Reduced here!
person Ann Zen    schedule 11.01.2021

Bagaimana saya bisa melakukan animasi itu dengan kecepatan normal?

Jangan gunakan while True: atau sleep() di dunia yang digerakkan oleh peristiwa seperti turtle! Sebagai gantinya, gunakan acara turtle timer:

from turtle import Screen, Turtle

def rectangle(t):
    t.forward(50)
    t.left(90)
    t.backward(5)
    t.pendown()

    for _ in range(2):
        t.forward(10)
        t.right(90)
        t.forward(120)
        t.right(90)

    t.penup()

def windmill(t):
    for _ in range(4):
        t.penup()
        rectangle(t)
        t.goto(0, 0)

screen = Screen()
screen.tracer(0)

turtle = Turtle()
turtle.setheading(90)

def rotate():
    turtle.clear()
    windmill(turtle)
    screen.update()
    turtle.left(1)

    screen.ontimer(rotate, 40)  # adjust speed via second argument

rotate()

screen.mainloop()

Anda dapat menyesuaikan argumen kedua menjadi ontimer() (dalam milidetik) untuk mengontrol seberapa cepat animasi berjalan.

person cdlane    schedule 11.01.2021