猫史档案馆


【Python作品分享】给航天人的一张明信片【36强进10】【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

可以查看作者的明信片,也可以自行制作明信片。

 

【作品源代码】

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


回复

上一页1 页 / 共 0下一页