这是一个综合时间获取和窗体绘图的练习,可以在屏幕上显示当前时间,并且其位置可以随机移动,实现时钟屏保的效果。
先从最简单的开始,即在屏幕上先输出一个当前时间:
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大数据分析-李树青https://www.njcie.com/python/