如何在乌龟屏幕上输出变量?

How to output variable on turtle screen?

我想在Turtle屏幕上输出一个变量。但是随着变量的变化,之前的值还在屏幕上。因此,这些值是重叠的。方法turtle.clear()没有解决问题,因为它会导致屏幕上的值闪烁。

# -*- coding: utf-8 -*-

import turtle
from math import *

s = turtle.Screen()
body = turtle.Turtle()
time_t = turtle.Turtle()
time_t.penup() # For time output
time_t.ht()

def Motion(A=100, omega=5, N=2):
    n = 0
    t = 0

    def x_pos(t):
        return A*cos(0.5*omega*t)  # x

    def y_pos(t):
        return A*sin(1*omega*t)  # Кy

    body.setposition(x_pos(t),y_pos(t))
    body.pendown()

    while n<N:
        body.setposition(x_pos(t),y_pos(t))
        t = round(t + 0.01,2)
        time_t.setposition(200,200)  # In this position I want to output variable
        time_t.write("t = " + str(t))  # Show the time variable t on screen
        if int(round(t / (2*pi/omega),2)) == n + 1:
              n =  n + 1


body.penup()
body.color('red')
body.shape('circle')
Motion()
turtle.done()

我们可以做一些事情来改善这种情况。第一种是使用 turtle 的撤消功能来删除旧时间信息作为清除它的一种方式。其次,我们可以使用 tracer()update() 来控制动画更新以控制闪烁:

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

screen = Screen()

body = Turtle(shape="circle")
body.color('red')
body.penup()

time_t = Turtle(visible=False)  # For time output
time_t.penup()
time_t.setposition(200, 200)  # In this position I want to output variable
time_t.write("t = " + str(0))

screen.tracer(0)  # Control animation updates ourself

def Motion(A=100, omega=5, N=2):
    n = 0
    t = 0

    def x_pos(t):
        return A * cos(0.5 * omega * t)  # x

    def y_pos(t):
        return A * sin(1 * omega * t)  # Ky

    body.setposition(x_pos(t), y_pos(t))
    body.pendown()

    while n < N:
        body.setposition(x_pos(t), y_pos(t))

        t = round(t + 0.01, 2)
        time_t.undo()  # undraw the last time update
        time_t.write("t = " + str(t))  # Show the time variable t on screen
        screen.update()

        if int(round(t / (2 * pi / omega), 2)) == n + 1:
            n = n + 1

Motion()

screen.exitonclick()

顺便说一句,乌龟的使用非常酷!让我们更进一步:使运动连续;在动画期间的任何时候启用点击退出;在乌龟处于初始位置之前不要让它可见;增大字体大小以便我们可以看到时间:

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

def motion():
    global n, t
    body.setposition(x_pos(t), y_pos(t))

    t = round(t + 0.01, 2)
    time_t.undo()  # undraw the last time update
    time_t.write("t = " + str(t), font=font)  # Show the time variable t on screen
    screen.update()

    if int(round(t / (2 * pi / omega), 2)) == n + 1:
        n = n + 1
        if (n >= N):
            n = t = 0

    screen.ontimer(motion, 10)

def x_pos(t):
    return A * cos(0.5 * omega * t)  # x

def y_pos(t):
    return A * sin(1 * omega * t)  # Ky

A = 100
omega = 5
N = 2
n = t = 0

font = ("Arial", 12, "normal")

screen = Screen()
screen.tracer(0)  # Control animation updates ourself

body = Turtle(shape="circle", visible=False)
body.color('red')
body.penup()
body.setposition(x_pos(t), y_pos(t))
body.pendown()
body.showturtle()

time_t = Turtle(visible=False)  # For time output
time_t.penup()
time_t.setposition(200, 200)  # In this position I want to output variable
time_t.write("t = " + str(0))

screen.ontimer(motion, 100)

screen.exitonclick()