基本思路:將動態gif圖的每一幀圖片存儲到一個數組里面,然后調用after()方法不斷的去循環更新圖片
代碼沿用前面介紹的(關不掉的小姐姐程序python tkinter實現 學習---打包教程)的代碼,這個代碼能看懂的話,下面的代碼也就很好理解了,就多了一個update()函數,里面調用了after()函數對圖片不斷更新
import tkinter as tk#這個語句導入tkinter模塊,但為方便,為它定義了一個別名tk。 import os import tkinter.messagebox #messagebox是普通windows編程中經常用到的,目的是顯示個信息框 import base64#要將編碼之后的圖片數據解碼並保存為圖片 import os#我們刪除圖片,這個要添加進來 from main_w_gif import img as socket_one #接下來就是在文件中導入你剛剛生成的xxx.py文件,因為每個圖片文件里面都是img變量,所以導入的時候可以用別名,這是python的基本用法了,不再多說。 from not_gif import img as socket_two from sure_gif import img as socket_three tmp = open('socket_one.gif', 'wb') #這是解碼。保存圖片 tmp.write(base64.b64decode(socket_one)) tmp = open('socket_two.gif', 'wb') tmp.write(base64.b64decode(socket_two)) tmp = open('socket_three.gif', 'wb') tmp.write(base64.b64decode(socket_three)) tmp.close()#現在就能用了,用完(加載到程序里之后) """ 我們編寫的Python代碼會調用內置的Tkinter,Tkinter封裝了訪問Tk的接口; Tk是一個圖形庫,支持多個操作系統,使用Tcl語言開發; Tk會調用操作系統提供的本地GUI接口,完成最終的GUI。 所以,我們的代碼只需要調用Tkinter提供的接口就可以了 tkinter的兩種寫法,這兩種寫法是有區別的, 第一種,使用就需要加類名,也就是需要加tkinter, 第二種,已經把tkinter完全導入了,你不用管調用的是哪個類,只管使用就可以了。所以不需要加類名。 #法1: import tkinter win=tkinter.Tk() win.mainloop() #法2: from tkinter import * win=Tk() """ window = tk.Tk() # 設置主窗口大小 window.geometry('600x500') # 設置主窗口標題 window.title('caiya') def closeWindow(): tkinter.messagebox.showerror(title='別這樣',message='還沒回答呢!') #錯誤消息框 return window.protocol('WM_DELETE_WINDOW', closeWindow) # 設置文字 lable1 = tk.Label(window, text="灰-灰-灰-非-飛") #, font=("Arial", 14) lable2 = tk.Label(window, text="請問你是不是你們實驗室最漂亮,最可愛,最努力,最認真的小師妹?") #, font=("Arial", 34) numIdx = 6 # gif的幀數 frames = [tk.PhotoImage(file='socket_one.gif', format='gif -index %i' %(i)) for i in range(numIdx)] imgLabel = tk.Label(window) # 調用tkinter的布局管理模塊 lable1.pack() lable2.pack() imgLabel.pack() numIdx1 = 6 # gif的幀數 photo1 = [tk.PhotoImage(file='socket_two.gif', format='gif -index %i' %(i)) for i in range(numIdx1)] numIdx2 = 6 # gif的幀數 photo2 = [tk.PhotoImage(file='socket_three.gif', format='gif -index %i' %(i)) for i in range(numIdx2)] def Love(): love = tk.Toplevel(window) love.geometry('380x320') love.title("caiya") lable = tk.Label(love,text="哈哈,我猜就是") #, font=("Arial", 24) imgLabel1 = tk.Label(love) imgLabel1.pack() update1(0,imgLabel1,love) btn = tk.Button(love, text="完美結束",width=30, height=2) btn.config(command=lambda :closelove(love)) lable.pack() love.protocol('WM_DELETE_WINDOW', closeall) btn.pack() # 點擊不喜歡的操作 def NoLove(): no_love = tk.Toplevel(window) no_love.geometry('600x350') no_love.title("caiya") lable = tk.Label(no_love,text="這樣騙自己真的好嗎?") #, font=("Arial", 24) imgLabel2 = tk.Label(no_love) imgLabel2.pack() btn = tk.Button(no_love, text="BACK",width=30, height=2) btn.config(command=lambda :closenolove(no_love)) lable.pack() btn.pack() update2(0, imgLabel2,no_love) # 子窗口關閉操作 def closeall(): window.destroy() def closelove(love): window.destroy() def closenolove(no_love): no_love.destroy() # 設置按鈕 btn1 = tk.Button(window, text=" 是 ",width=30, height=2) # 配置按鈕 btn1.config(command=Love) btn2 = tk.Button(window, text="不是",width=30, height=2) btn2.config(command=NoLove) # 調用tkinter的布局管理模塊 btn1.pack() btn2.pack() #定時器函數 def update(idx): frame = frames[idx] idx += 1#下一張的序號 imgLabel.configure(image=frame) window.after(100, update, idx%numIdx)#200毫秒之后繼續執行定時器函數 def update1(idx,imgLabel1,love): frame = photo2[idx] idx += 1 imgLabel1.configure(image=frame) idx=idx%numIdx1 love.after(200, update1,idx%numIdx1,imgLabel1,love) def update2(idx,imgLabel2,no_love): frame = photo1[idx] idx += 1 imgLabel2.configure(image=frame) idx=idx%numIdx2 no_love.after(200, update2,idx%numIdx2,imgLabel2,no_love) update(0) window.mainloop() """ window.mainloop就會讓window不斷的刷新,如果沒有mainloop,就是一個靜態的window,傳入進去的值就不會有循環,mainloop就相當於一個很大的while循環,有個while,每點擊一次就會更新一次,所以我們必須要有循環 所以的窗口文件都必須有類似的mainloop mainloop是窗口文件的關鍵的關鍵的關鍵。 """ os.remove('socket_one.gif')#刪除圖片 os.remove('socket_two.gif') os.remove('socket_three.gif')