Python 实现“嫦娥奔月“小动画,一起来看看这漂亮的嫦娥吧

请添加图片描述

目录

源代码:

素材图片 

程序效果

附录

tkinter Canvas 组件


  中秋节快要来了,“嫦娥奔月”是我国古代的一个美丽神话,它反映了古代人类祖先飞天和探索宇宙苍穹的梦想。现在伟大的中国航天人为实现这一梦想取得了重大科技成就,神舟系列载人航天飞船发射成功是我们每个炎黄子孙的骄傲!

  恰逢神舟十二号今天返航,中国航天员首次从中国空间站返回地球!而且神舟十三号也即将准备发射!!

  一个伟大的日子里做个小动画能否圆个飞天梦想呢,算是痴人说梦吧!不废话了,翠花,上酸菜:

源代码:

import tkinter as tk
from time import sleep

def init():
    global cv,chang
    cv.delete('all')
    img1 = tk.PhotoImage(file='MOON.gif')
    img2 = tk.PhotoImage(file='CHANG.gif')
    moon = cv.create_image(100,100,image=img1)
    chang = cv.create_image(936,680,image=img2)
    cv.update()
 
def move1():
    global cv,btn1,btn2,chang
    btn1.configure(state=tk.DISABLED)
    btn2.configure(state=tk.DISABLED)
    cv.coords(chang,936,680)
    t = [i for i in range(10,72)]
    for i in range(62):
        cv.move(chang,-13,-9)
        cv.update()
        sleep(t[i]/323)
    btn1.configure(state=tk.NORMAL)
    btn2.configure(state=tk.NORMAL)
    
def move2():
    global cv,btn1,btn2,chang
    btn1.configure(state=tk.DISABLED)
    btn2.configure(state=tk.DISABLED)
    cv.coords(chang,936,680)
    x = lambda i:i*30
    y = lambda i:0.6*i*i+110
    for t in range(30,3,-1):
        cv.coords(chang,x(t),y(t))
        cv.update()
        sleep(0.2)
    btn1.configure(state=tk.NORMAL)
    btn2.configure(state=tk.NORMAL)
 
def main():
    global cv,chang,btn1,btn2
    root = tk.Tk()
    root.geometry('1024x768')
    root.title(u'嫦娥奔月')
    root.resizable(False,False)
    cv = tk.Canvas(root, width=1024, height=768, bg='black')
    cv.pack()
    btn1 = tk.Button(root,text=' 嫦娥直线奔月',command=move1)
    btn1.place(x=80,y=680)
    btn2 = tk.Button(root,text=' 嫦娥抛物线奔月',command=move2)
    btn2.place(x=220,y=680)
    img1 = tk.PhotoImage(file='MOON.gif')
    img2 = tk.PhotoImage(file='CHANG.gif')
    moon = cv.create_image(100,100,image=img1)
    chang = cv.create_image(936,680,image=img2)
    root.mainloop()
 
if __name__=="__main__":
 
    app = main()

注:tk.Canvas.coords(object,x,y) 参数方程直接作x,y坐标参数移动object非常方便。
 

素材图片 

程序效果

俗话说每个人都有一个哈姆雷特,在这中秋佳节团圆日里,祝愿每个为此文点赞的人,都会有一个漂亮的嫦娥姐姐!

附录

tkinter Canvas 组件

Canvas(画布)组件为 Tkinter 的图形绘制提供了基础。Canvas 是一个高度灵活的组件,你可以用它绘制图形和图表,创建图形编辑器,并实现各种自定义的小部件。

Canvas(root, width=100, height=100) 单位像素

创建的对象一直保留,直到被修改才会覆盖

修改方法:

w.coords() 移动对象

w.itemcofig() 设置对象属性

w.delete() 删除对象

Canvas 组件支持对象

arc(弧形、弦或扇形)
bitmap(内建的位图文件或 XBM 格式的文件)
image(BitmapImage 或 PhotoImage 的实例对象)
line(线)
oval(圆或椭圆形)
polygon(多边形)
rectangle(矩形)
text(文本)
window(组件)
其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形都是由轮廓线和填充颜色组成的,但都可以设置为透明(传入空字符串表示透明)。

常用创建方法:

Create_line(x1,y1,x2,y2,dash=(4,4), fill='blue') -- 直线, 虚线(指定dash)

Create_rectangle() -- 矩形,添加对角坐标

Create_oval() -- 椭圆,使用的是长方形的坐标绘制的,正方形坐标时就是圆形

Create_text(x,y, text='F') --字体中心点坐标

create_arc(bbox, **options) -- 根据 bbox (x1, y1, x2, y2) 创建一个扇形(PIESLICE)、弓形(CHORD)或弧形(ARC)

style

1. 指定该方法创建的是扇形(PIESLICE)、弓形(CHORD)还是弧形(ARC)

2. 默认创建的是扇形

create_polygon(coords, **options) -- 根据 coords 给定的坐标绘制一个多边形

坐标系

由于画布可能比窗口大(带有滚动条的 Canvas 组件),因此 Canvas 组件可以选择使用两种坐标系:

窗口坐标系:以窗口的左上角作为坐标原点
画布坐标系:以画布的左上角作为坐标原点
将窗口坐标系转换为画布坐标系,可以使用 canvasx() 或 canvasy() 方法:

def callback(event):

    canvas = event.widget

    x = canvas.canvasx(event.x)

    y = canvas.canvasy(event.y)

    print canvas.find_closest(x, y)

对象显示顺序:

Canvas 组件中创建的画布对象都会被列入显示列表中,

默认情况下新创建的会覆盖旧的画布对象的重叠部分,即位于显示列表上方的画布对象将覆盖下方那个)。当然,显示列表中的画布对象可以被重新排序。

指定画布对象

Canvas 组件提供几种方法让你指定画布对象:

Item handles (tkinter自动创建的唯一的画布对象的 ID--整型)
Tags  ( 类似于text的 Tags但 是仅为画布对象所拥有)
ALL  (Canvas中所有对象)
CURRENT  (鼠标指针下的画布对象(如果有的话))


end.

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Hann Yang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值