用户:
HJS_鱼缸下的我查看:0 回复:0 评论:0 创建时间:2021-05-23T22:35:17
【作品展示】

【作品介绍】
可以查看作者的明信片,也可以自行制作明信片。
【作品源代码】
import turtle, easygui, math, time
# 初始化
def pen_init():
global p
p = turtle.Pen()
turtle.title('给航天人的一张明信片')
p.speed(0)
p.hideturtle()
turtle.bgcolor('black')
easygui.msgbox('重要的事情说三遍,\n\n一定要全屏观看!\n\n一定要全屏观看!\n\n一定要全屏观看!', '提示', '知道了')
def text_init():
global word, name, line, wordy
line = int((len(word) + 2) / 10 + 0.5)
l = [''] * line
for i in range(2, len(word) + 2):
l[i // 10] += word[i - 2]
word = ' ' + '\n'.join(l)
wordy = 100 - 25 * line
# 快速绘制填色多边形函数
def draw(pos, color_1, color_2, addx = 0, addy = 0, size = 1):
p.color(color_1)
p.begin_fill()
p.up()
p.goto(pos[len(pos) - 1][0] * size + addx, pos[len(pos) - 1][1] * size + addy)
p.down()
for x, y in pos:
p.goto(x * size + addx, y * size + addy)
p.color(color_2)
p.end_fill()
# 重新选择
def msg():
easygui.msgbox('请重新选择!', '注意', '知道了')
# 绘制明信片
def postcard():
# 绘制边框
p.pensize(3)
draw([[-400, 200], [400, 200], [400, -200], [-400, -200]], 'black', 'white')
global minx, miny, maxx, maxy
minx, miny, maxx, maxy = -400, -200, 400, 200
# 选择明信片造型
s = [saturn, moon, satellite, rocket]
t = easygui.indexbox('请选择一个明信片的造型', '请选择', ('土星', '月球', '人造卫星', '火箭'))
while t == None:
msg()
t = easygui.indexbox('请选择一个明信片的造型', '请选择', ('土星', '月球', '人造卫星', '火箭'))
# 开始绘制明信片画面
hs = s[t]
hs()
# 绘制地址格
p.pensize(2)
for i in range(6):
draw([[-390, 190], [-350, 190], [-350, 150], [-390, 150]], 'red', 'white', addx = i * 50)
# 绘制粘贴邮票处
draw([[280, 190], [370, 190], [370, 70], [280, 70]], 'black', 'white')
# 绘制3条线
p.pensize(1)
for i in range(3):
draw([[50, 0], [350, 0]], 'black', 'black', addy = -i * 70)
# 绘制中间线
draw([[0, 150], [0, -150]], 'black', 'black')
time.sleep(1)
# 绘制“贴邮票处”字样
p.up()
p.goto(305, 110)
p.write('贴 邮\n\n票 处', font = ['Simhei', 10])
time.sleep(1)
# 写下我对航天人说的话
p.color('black')
texts = [('北京市海淀区阜成路甲8号国家航天局', 50, 0, 15), ('全体航天人', 50, -70, 15),
(name, 50, -140, 15), (word, -340, wordy, 20), ('1 0 0 0 3 7', -380, 155, 25)]
for i, x, y, s in texts:
p.goto(x, y)
p.write(i, font = ['Simhei', s])
# 绘制月球
def moon():
# 绘制月球本体
p.up()
p.color(1, 1, 220 / 255)
p.goto(0, 0)
p.dot(350)
# 绘制月球凹凸不平的地形
p.color(240 / 255, 240 / 255, 210 / 255)
xys = [[100, 80, 60], [-20, -10, 40], [-10, 100, 50],
[-130, 80, 35], [100, -60, 45], [60, 40, 50],
[15, -150, 30], [-90, -90, 80], [-70, 20, 60]]
for x, y, s in xys:
p.goto(x, y)
p.dot(s)
p.down()
# 绘制人造卫星
def satellite():
black, grey, blue, fd, pos = '#999999', '#CCCCCC', '#66AAFF', [150, 90, 0], [[[0, 0], [150, -40], [150, -120], [0, -80]], [[5, 5], [155, -35], [150, -40], [0, 0]], [[150, -40], [155, -35], [155, -115], [150, -120]]]
# 卫星“翅膀”上太阳能板的网格添加到位置列表中,方便遍历
for i in range(1, 5):
pos.extend([[[i * 30, i * -8], [i * 30, i * -8 - 80]]])
for i in range(1, 3):
pos.extend([[[0, i * -80 / 3], [150, i * -80 / 3 - 40]]])
# 为了制造出“翅膀”与本体的遮挡效果,需要先绘制左翼,再绘制本体,再绘制右翼
for i in range(2):
# 绘制卫星本体
if i == 1:
p.up()
p.goto(-30, -70)
p.down()
p.setheading(60)
for dis in fd:
p.color(black)
p.begin_fill()
for i in range(2):
p.fd(dis)
p.circle(40, 180)
p.color(grey)
p.end_fill()
p.color(black)
# 绘制卫星“翅膀”
for j in pos:
draw(j, black, blue, addx = -200 + 230 * i, addy = 130 - 60 * i)
# 绘制土星
def saturn():
clr = '#FFFF99'
clr2 = '#FFFF55'
p.color(clr)
p.pensize(30)
a, b, x, y, m = 250, 100, 0, 0, 30
i, j = m / 180 * math.pi, 0
p.up()
p.goto((a * math.cos(j) * math.cos(i) - b * math.sin(j) * math.sin(i) + x, a * math.cos(j) * math.sin(i) + b * math.sin(j) * math.cos(i) + y))
p.down()
# 绘制星环
for num in range(1, 601):
j = (2 * math.pi / 600) * num
# 同样的,为了制造出星环和行星的遮挡效果,星环绘制到一半的时候绘制行星本体
if num == 300:
p.up()
p.color(clr2)
p.goto(x, y)
p.dot(350)
p.goto(next_point)
p.color(clr)
p.down()
next_point = (a * math.cos(j) * math.cos(i) - b * math.sin(j) * math.sin(i) + x, a * math.cos(j) * math.sin(i) + b * math.sin(j) * math.cos(i) + y)
p.goto(next_point)
# 绘制火箭
def rocket():
# 绘制火箭本体
p.pensize(2)
y, x, size, colorl, colorh, colorc = -40, -200, 0.7, '#66AAFF', '#999999', '#FFA000'
draw([[0, 230], [-20, 170], [-20, 120], [20, 120], [20, 170]], colorh, colorl, addy = y, addx = x, size = size)
draw([[-20, 120], [-20, -115], [-15, -120], [15, -120], [20, -115], [20, 120]], colorh, colorl, addy = y, addx = x, size = size)
draw([[-25, -65], [-30, -80], [-30, -115], [-20, -115], [-20, -80]], colorh, colorl, addy = y, addx = x, size = size)
draw([[-28, -115], [-25, -125], [-22, -115]], colorh, colorc, addy = y, addx = x, size = size)
draw([[25, -65], [30, -80], [30, -115], [20, -115], [20, -80]], colorh, colorl, addy = y, addx = x, size = size)
draw([[28, -115], [25, -125], [22, -115]], colorh, colorc, addy = y, addx = x, size = size)
draw([[-15, -120], [-10, -135], [-5, -130], [0, -150], [5, -130], [10, -135], [15, -120]], colorh, colorc, addy = y, addx = x, size = size)
# 绘制“中国航天”字样
p.color('#FF9999')
p.up()
for c in range(4):
p.goto(-208, 0 - 30 * c)
p.write('中国航天'[c], font = ['Arial', 15])
p.down()
# 制作自己的明信片
def make_your_own_postcard():
global word, name, wordy
is_continue = easygui.ynbox('看完作者的明信片,你也制作一张自己的明信片吧!', '提示', ('好的', '算了吧'))
while is_continue == None:
msg()
is_continue = easygui.ynbox('你也给航天人制作一张自己的明信片吧!', '提示', ('好的', '算了吧'))
if not is_continue:
return
c = True
while c:
p.clear()
name = easygui.enterbox('你的名字与地址(不宜超过15字):', '请输入')
word = easygui.enterbox('你要对航天人说的话(不宜超过100字):', '请输入')
if name == None:
name = ''
if word == None:
word = ''
text_init()
postcard()
time.sleep(5)
c = easygui.ynbox('你的明信片已制作完成,截屏并调整至合适的大小保存起来吧!', '提示', ('重新生成', '知道了'))
while c == None:
msg()
c = easygui.ynbox('你的明信片已制作完成,截屏并调整至合适的大小保存起来吧!', '提示', ('重新生成', '知道了'))
# main函数
if __name__ == '__main__':
pen_init()
word = '航天英雄们,你们为中国航天事业付出了很多很多,有你们的付出,才有中国现在的成就,你们才是我们应该崇拜的人!'
name = '编程猫社区 HJS_鱼缸下的我'
text_init()
postcard()
time.sleep(5)
make_your_own_postcard()
turtle.done()
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn