2016-11-04 95 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() 

BTW,非常酷的使用龟!让我们更进一步:让动作连续;点击在动画期间的任何点启用退出;不要让身体龟直到它的初始位置;颠簸的字体大小,所以我们可以看到时间:

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