强基初中数学&学Python——第九十八课 海龟画图基本操作方法之十二:定时器与恢复缓冲区

——定时器——

  turtle.ontimer(fun, t=0),设置一个定时器,在t毫秒后调用fun函数。

  参数fun,一个无参数的函数或对象方法。

  参数t ,以毫秒计算的时间数值 >= 0

  附录1是秒计时器的代码,执行录屏如下

  

——恢复缓冲区——

  turtle.setundobuffer(size)

  参数size,一个整数或None,表示缓冲区的最大条目数。附录2进行了测试,测试结果:size=Nonesize≤0时,关闭恢复区,undo函数无效;当size≥1时,最大有效调用sizeundo

  turtle.undobufferentries()

  返回缓冲区的已用的条目数。注意不是最大条目数。附录3把缓冲区最大条目数设为10,执行5次操作后用这个函数查询条目数。测试结果条目数是5

>>>
undobufferentries=5.
>>>

  附录4测试默认的最大条目数,结果是1000

>>>
max undobufferentries=1000.
>>>

  附录5恢复全部缓冲条目。

 

  练习1:仿造附录1,作出有时分秒的计时器。

 

附录1

#秒计时器
import turtle as t  #导入海龟画图模块
t.setup(500, 500)  #建立500x500的窗口
t.screensize(400, 400) #创建400x400的画布
t.up() #提笔
t.ht()  #隐藏海龟
t.setx(100) #把海龟位置移到x坐标100处,y坐标不变,由于原坐标是(0,0),所以实际坐标是(100,0)
font=("黑体",60,"normal")  #普通60(60x60)黑体字
t.write("000.0", align="right", font=font) #右对齐打印000.0
millsTime=0  #以毫秒为单位的累计时间
step=100  #时间间隔数0.1
running=False  #运行开关
#打印一次时间
def writeTime():
    global millsTime  #强迫为全局变量,这样可以用于函数体的等号左边
    millsTime+=step  #增加一个时间间隔
    ms=millsTime % 1000 #算出不满秒的数
    s=(millsTime-ms)//1000 #算出秒数
    ms=ms//100 #算出0.1秒数
    st=str(s)+"."+str(ms)  #构建打印字符串
    t.undo()  #清除上面的字符
    t.write(st, align="right", font=font)   #打印时间字符串
    if running:  #如果运行开关为真,开启新的计时
        t.ontimer(writeTime,step)
    else:  #如果运行开关为假,重置累计时间
        millsTime=0     
#鼠标点击开启或关闭      
def ss(xdummy=None, ydummy=None):  
    global running
    running = not  running   
    if running:
        t.ontimer(writeTime,step)
t.onscreenclick(ss)       #ss绑定到鼠标左键点击画布。
t.mainloop()

 

附录2

>>> import turtle as t

>>> t.setup(500, 500)

>>> t.screensize(400, 400)

>>> t.setundobuffer(-1)
>>> t.fd(100)
>>> t.undo()
>>> t.setundobuffer(0)
>>> t.left(90)
>>> t.fd(100)
>>> t.undo()
>>> t.setundobuffer(1)
>>> t.left(90)
>>> t.fd(100)
>>> t.undo()
>>> t.undo()
>>> t.setundobuffer(None)
>>> t.fd(100)
>>> t.undo()
>>> 

 

 

附录3
#缓冲区
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.setundobuffer(10)
for i in range(5):
    t.fd(5)
print("undobufferentries=%d." % t.undobufferentries())

 

附录4
#缓冲区默认最大条目数
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.setundobuffer(10)
maxEtrs=0
while True:
    t.fd(5)
    temp=t.undobufferentries()
    if temp==maxEtrs:
        break
    else:
        maxEtrs=temp
print("max undobufferentries=%d." % maxEtrs)

 

附录5

#缓冲区条目数
import turtle as t
t.setup(500, 500)
t.screensize(400, 400)
t.setundobuffer(30)
maxEtrs=0
while True:
    t.fd(5)
    t.left(5)
    temp=t.undobufferentries()
    if temp==maxEtrs:
        break
    else:
        maxEtrs=temp
print("max undobufferentries=%d." % maxEtrs)
while t.undobufferentries():
    t.undo()