使用tkinter显示动态gif
生活随笔
收集整理的這篇文章主要介紹了
使用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')
總結
以上是生活随笔為你收集整理的使用tkinter显示动态gif的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何在局域网中利用Excel聊天
- 下一篇: 公司车可以抵押贷款吗 公司的车能做抵押吗