zoukankan      html  css  js  c++  java
  • 使用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')
  • 相关阅读:
    使用libcurl POST数据和上传文件
    Google Protocol Buffer 的使用和原理
    curl如何处理cookie
    volatile语义及线程安全singleton模式探讨
    OpenCV 入门级一
    SEBank银行项目实施说明
    SEBank银行项目文件编写规范
    SEBank银行项目体系结构设计报告
    SEBank银行项目体系结构设计报告
    SEBank银行项目第一个星期的进度安排
  • 原文地址:https://www.cnblogs.com/caiya/p/11917372.html
Copyright © 2011-2022 走看看