2016-11-04 2 views
1

Я хочу вывести переменную на экране черепахи. Но по мере изменения переменной предыдущее значение все еще находится на экране. Таким образом, значения перекрываются. Метод 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() 
+0

Если оно не должно мерцать, что вы ожидаете? каково ваше требование? Вы хотите вывести свое окончательное значение «t», которое равно 2,51? –

ответ

2

Есть несколько вещей, которые мы можем сделать для улучшения ситуации. Во-первых, используйте функцию «Отменить» черепахи, чтобы удалить старую информацию времени как способ ее очистки. Во-вторых, мы можем использовать 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() 
Смежные вопросы