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