中秋节快要来了,“嫦娥奔月”是我国古代的一个美丽神话,它反映了古代人类祖先飞天和探索宇宙苍穹的梦想。现在伟大的中国航天人为实现这一梦想取得了重大科技成就,神舟系列载人航天飞船发射成功是我们每个炎黄子孙的骄傲!
恰逢神舟十二号今天返航,中国航天员首次从中国空间站返回地球!而且神舟十三号也即将准备发射!!
一个伟大的日子里做个小动画能否圆个飞天梦想呢,算是痴人说梦吧!不废话了,翠花,上酸菜:
源代码:
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.