基本思路:将动态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')