How to output variable on turtle screen?

杀马特。学长 韩版系。学妹 提交于 2019-12-11 04:37:53

问题


I want to output a variable on the Turtle screen. But as the variable changes, the previous value is still on the screen. Thus, the values are overlapped. Method turtle.clear() does not solve the problem, because it causes the value to flicker on the screen.

# -*- 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()

回答1:


There are a couple of things we can do to improve the situation. The first is to use the Undo feature of turtle to remove the old time information as a way of clearing it. Second, we can use tracer() and update() to control animation updates to get flicker under control:

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

BTW, very cool use of turtle! Let's go a step further: make the motion continuous; enable the exit on click at any point during the animation; don't make the body turtle visible until it's in its initial position; bump up the font size so we can see the time:

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


来源:https://stackoverflow.com/questions/40418203/how-to-output-variable-on-turtle-screen

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!