5.5 时钟屏保

这是一个综合时间获取和窗体绘图的练习,可以在屏幕上显示当前时间,并且其位置可以随机移动,实现时钟屏保的效果。

先从最简单的开始,即在屏幕上先输出一个当前时间:

import turtle as t
import time

t.setup(1000, 600)
now = time.ctime()
t.write(now, font=("Times", 36, "bold"))
t.done()

输出为:

 其中获取当前时间是通过time模块的ctime方法来实现,并通过write方法结合特定字体、大小和加粗模式写在当前屏幕上。但是此时,该时间内容是以左下角和窗体中心对齐的方式来展示,接下来可以考虑在随机位置上输出当前时间:

import turtle as t
import time
import random

t.setup(1000, 600)
x = random.randint(-500, 500)
y = random.randint(-300, 300)
t.setpos(x, y)
now = time.ctime()
t.write(now, font=("Times", 36, "bold"))
t.done()

输出为(每次运行显示的位置不一定和此一样):

这里主要增加了对输出时间位置的控制。刚才已说明输出文字是以左下角坐标来对齐位置,因此可以使用随机数来替换默认的(0,0)这个左下角位置坐标。为此,随机生成了x和y,其数值都在屏幕显示范围内。最后,通过setpos设置当前绘图点,绘制文本即以此作为左下角位置。但是,我们总是可以看到有一条直线指向这个左下角。原因在于setpos方法在移动绘图点的同时,也绘制了经过的轨迹。

修改代码取消直线绘制:

import turtle as t
import time
import random

t.setup(1000, 600)
x = random.randint(-500, 500)
y = random.randint(-300, 300)
t.penup()
t.setpos(x, y)
t.pendown()
now = time.ctime()
t.write(now, font=("Times", 36, "bold"))
t.done()

输出为:

 主要在setpos方法的前后增加了抬笔和放笔的动作,使得移动绘图点的同时不再同时绘图。

为了实现进一步的随机移动效果,可以增加循环显示的功能,即通过增加循环不断在随机位置上显示新的当前时间,应该可以实现时钟屏保的效果:

import turtle as t
import time
import random

t.setup(1000, 600)
while True:
    x = random.randint(-500, 500)
    y = random.randint(-300, 300)
    t.penup()
    t.setpos(x, y)
    t.pendown()
    now = time.ctime()
    t.write(now, font=("Times", 36, "bold"))
t.done()

输出为:

代码思路很简单,就是将刚才的随机位置绘制当前时间的代码放在一个死循环当中。虽然确实可以不断的在随机位置上显示时间,但是以前的时间却没有去除,导致界面内容越来越混乱。 

因此,正确的做法应该是清屏后再绘制新的时间:

import turtle as t
import time
import random

t.setup(1000, 600)
while True:
    x = random.randint(-500, 500)
    y = random.randint(-300, 300)
    t.penup()
    t.setpos(x, y)
    t.pendown()
    now = time.ctime()
    t.clear()
    t.write(now, font=("Times", 36, "bold"))
t.done()

输出为:

这里在输出当前时间前,通过clear方法清空已有窗体内容,实现清屏后输出时间的效果。


最后,对该程序做适当的美化。

1)目前的随机位置效果太强,以至于每次显示的位置都可能跨越较大的距离。能否产生一种在当前位置略微偏移的随机效果,这样可以使得绘制效果更为平滑。一种可行的选择就是采用偏移方法表示新的位置,而不是直接使用一个完全新的随机数作为新的位置。

代码也正好体现了刚才的思路。每次产生的随机数只有-10到10之间的大小,并以此增加到现有的位置上,实现在当前位置略微随机偏移的效果。完整代码为:

import turtle as t
import time
import random

t.setup(1000, 600)
while True:
    x = random.randint(-10, 10)
    y = random.randint(-10, 10)
    t.penup()
    t.setpos(t.pos()[0] + x, t.pos()[1] + y)
    t.pendown()
    now = time.ctime()
    t.clear()
    t.write(now, font=("Times", 36, "bold"))
t.done()

2)目前的时间内容过于复杂,实际往往只需显示小时分钟秒即可。为此,就需要获取当前时间的小时分钟秒,具体可以使用localtime的属性,如:

为了实现和其他字符串的拼接,这里要注意整数向字符串的转换,完整代码为:

import turtle as t
import time
import random
t.setup(1000, 600)
while True:
    x = random.randint(-10, 10)
    y = random.randint(-10, 10)
    hour = str(time.localtime().tm_hour)
    minute = str(time.localtime().tm_min)
    second = str(time.localtime().tm_sec)
    t.penup()
    t.setpos(t.pos()[0] + x, t.pos()[1] + y)
    t.pendown()
    now = time.ctime()
    t.clear()
    t.write(hour+':'+minute+':'+second,font=("Times", 36, "bold"))
t.done()

配套学习资源、慕课视频:

Python大数据分析-李树青icon-default.png?t=M1L8https://www.njcie.com/python/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leeshuqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值