使用tkinter顯示動態gif


基本思路:將動態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')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM