Python制作一個貓咪小秒表 [復制鏈接]

2019-4-4 10:03
一碼到底 閱讀:127 評論:0 贊:0
Tag:  

秒表是一項隨處可見的神奇小物件,最常用到秒表的兩大場景,一個是運動會,另一個是健身房,因此也總是讓人聯想到汗水和心跳,賁張的血管,粗重的呼吸,時間似乎變得緩慢,那一只聚攏萬千目光的小小秒表,此刻卻像一座沉重而古老的大鐘,每一次悠長的回擺都回蕩著歲月的鈍響,一次又一次把人們的心提到了嗓子眼。那么,秒表有沒有辦法做的可愛、調皮一點呢?比如像下圖這樣的貓咪秒表。

要實現這樣的效果,用python就足夠了。主要用到的就是matplotlib包。

首先,下載貓咪的gif圖,然后將gif圖切分成多張png圖。用這幾句代碼就可以實現:

im=Image.open(infile)
mypalette=im.getpalette()
im.putpalette(mypalette)
new_im=Image.new('RGBA',im.size)
new_im.paste(im)
new_im.save('image\\{}.png'.format(str(i)))

原始的gif是這樣的:

拆分成的png圖片:

然后,動畫的效果是通過幀動畫來實現的。每一幀都用一張上文生成的不同的png圖片,遍歷完png圖片之后,再繼續循環往復。不難看出,原始gif中的貓耳朵是向左的,如果改成向上的,看著要舒服一些。這就需要將圖片沿著斜45度角進行旋轉。用這幾行代碼就可以:

    newim=[]
    for m in range(len(im[0])):
        item=[]

        for n in range(len(im)):
             item.append(im[n][m])

        newim.append(item)
    newims.append(np.array(newim))

現在,貓咪的gif動畫是醬紫的。

接著,就是引入matplotlib,“支起”畫布,具體代碼如下:

import matplotlib.pyplot as plt
fig=plt.figure(figsize=(6,6))
ax=plt.gca()
ax.grid()

然后,就可以繪制指針了,用下面這句話:

#兩個[]的作用都是用于之后填充數據,當其中填充的數據不一樣的時候,指針也就不一樣,也就實現了動畫效果
anchor,=plt.plot([],[],'-',color=precolor,lw=1.8)

接著,就是繪制表盤的外圍以及“3”、“6”、“9”、“12”四個數字,用幾行代碼就可以搞定:

#繪制表盤
x_out=[r_out*np.cos(theta[i]) for i in range(len(theta))]
y_out=[r_out*np.sin(theta[i]) for i in range(len(theta))]
ln1.set_data(x_out,y_out)
#繪制“3”、“6”、“9”、“12”四個數字
ax.text(1.850"3",color='#791E94',fontsize=18,ha="center",va="center",fontproperties=font)
ax.text(-1.850"9",color='#791E94',fontsize=18,ha="center",va="center",fontproperties=font)
ax.text(0.051.85"12",color='#791E94',fontsize=18,ha="center",va="center",fontproperties=font)
ax.text(0.05-1.85"6",color='#791E94',fontsize=18,ha="center",va="center",fontproperties=font)

畫出來的效果是這樣的,是不是很卡通?

最后,就是動畫效果的實現,最主要的語句是這個:

#fig指的是畫布,update指的是執行每一幀更新的函數,length指的是一共有多少幀,init指的是第一幀所執行的函數
ani=animation.FuncAnimation(fig,update,length,init_func=init,interval=interval_time)

在update函數中,對貓咪的動作和指針的位置按幀來進行賦值,代碼如下:

#對貓咪的動作進行幀賦值
figcat.set_data(newims[i%6])
#對指針的位置進行幀賦值
anchor.set_data([0,anchor_ratio*math.cos(theta[i])*(r_out-2*r_in)],[0,anchor_ratio*math.sin(theta[i])*(r_out-2*r_in)])

ps:如果想要一邊看喵表走,一邊聽貓咪叫,那可以用python自帶的winsound模塊來實現。用下面這行代碼就可以:

#友情提示,'CatMeow.mp4'文件是需要自行下載的
winsound.PlaySound('CatMeow.mp4',winsound.SND_LOOP)


我來說兩句
您需要登錄后才可以評論 登錄 | 立即注冊
facelist
所有評論(0)
領先的中文移動開發者社區
18620764416
7*24全天服務
意見反饋:[email protected]

掃一掃關注我們

Powered by Discuz! X3.2© 2001-2019 Comsenz Inc.( 粵ICP備15117877號 )

两码中特期期