首页 > 编程语言 >wxpython编写的GUI中显示gif图片的另一种方法

wxpython编写的GUI中显示gif图片的另一种方法

时间:2023-04-01 16:12:38浏览次数:42  
标签:__ GUI gif shape wxpython 图片 self wx

当采用wx.adv.AnimationCtrl方法加载大尺寸gif图片出错的时候,就需要考虑用其他方式加载了;

这里用到了imageio.v3和numpy配合加载gif图片。代码实例如下。

注意的是,此代码并非gif加载全能的!当图片不规则还是会出现无法加载的情况(gif各帧之间大小不一,具体原因搞不懂);而且加载的gif图片大概率会出现频闪,经调试无果(技术太菜,代码是缝合的)。

import wx                            # 导入wxPython库
import imageio.v3 as iio             # 导入imageio库
import numpy as np                   # 导入numpy库

# 定义一个窗口类MyFrame,继承自wx.Frame类
class MyFrame(wx.Frame):
    def __init__(self, parent):
        # 调用父类构造函数,设置窗口的标题
        super().__init__(parent, title="GIF Display")
        
        # 初始化一个面板
        self.panel = wx.Panel(self)

        # 读取gif图片,并将其转化为numpy数组
        self.gif = iio.imread("Example002.gif")
        self.gif = [np.uint8(frame) for frame in self.gif]

        # 创建一个静态位图控件,用于显示gif图片
        self.gifCtrl = wx.StaticBitmap(self.panel, size=(self.gif[0].shape[1],self.gif[0].shape[0]))
        # 将第一帧设置为位图的初始值
        self.gifCtrl.SetBitmap(wx.Bitmap.FromBuffer(self.gif[0].shape[1], self.gif[0].shape[0], self.gif[0]))

        # 创建一个垂直方向的BoxSizer,用来布局gif图片控件
        vbox = wx.BoxSizer(wx.VERTICAL)
        vbox.AddStretchSpacer()
        vbox.Add(self.gifCtrl, 0, wx.CENTER)
        vbox.AddStretchSpacer()

        # 将BoxSizer设置为面板的布局管理器
        self.panel.SetSizer(vbox)

        # 添加计数器和定时器
        self.counter = 0
        self.timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.onTimer)   # 将定时器事件绑定到onTimer函数上
        self.timer.Start(100)                  # 间隔设置为100毫秒

    def onTimer(self, event):
        """
        定时器触发事件,更新gif图片
        """
        self.counter += 1                    # 计数器自增1
        idx = self.counter % len(self.gif)    # 计算当前帧的下标,使用模运算实现循环播放
        # 更新位图控件的值
        self.gifCtrl.SetBitmap(wx.Bitmap.FromBuffer(self.gif[idx].shape[1], self.gif[idx].shape[0], self.gif[idx]))

    def onResize(self, event):
        """
        当窗口大小改变时,重新定位gif图片的位置
        """
        w, h = self.GetClientSize()               # 获取窗口客户区的宽度和高度
        gif_w, gif_h = self.gifCtrl.GetSize()     # 获取gif图片控件的宽度和高度
        # 设置gif图片控件的新位置
        self.gifCtrl.SetPosition(((w - gif_w) // 2, (h - gif_h) // 2))
        event.Skip()

# 应用程序入口
if __name__ == '__main__':
    app = wx.App()       # 初始化wxPython应用程序
    frame = MyFrame(None) # 创建一个MyFrame实例
    frame.Show()          # 显示窗口
    app.MainLoop()

 

标签:__,GUI,gif,shape,wxpython,图片,self,wx
From: https://www.cnblogs.com/babashi9527/p/17278762.html

相关文章

  • python win32gui 无法控制 最小化后的桌面
    当远程桌面被最小化时,发现使用win32gui控制某软件置于最前台显示时失效,并报错:File"C:\Users\Administrator\Desktop\py-auto-login\robot\ktt_auth_code.py",line156,inwx_loginwin32gui.SetForegroundWindow(self._main_wnd)pywintypes.error:(0,'SetForegroun......
  • qs.stringify()、qs.parse()的使用
    一、qs是什么?qs是一个npm仓库所管理的包,可通过npminstallqs命令进行安装(axios自带qs,//importqsfrom'qs')importqsfrom"qs"; 二、基本用法2.1、qs.str......
  • Android 视频截取片段生成GIF
    就在昨天,依据公司需求,我当初辛辛苦苦写的视频生成GIF封面需求被砍.心痛之余,深海决定把代码分享出来,也希望要走这条路的小伙伴少走一些弯路优化建议:刚刚有小伙伴在评论......
  • POWERFUL CHATGPT SEO PROMPTS & A GUIDE TO CHATGPT PROMPT ENGINEERING
    ReadingTime:20minutes-UnlockthepotentialofAIcontentandSEOwithourguidetoPromptEngineering.PowerfulChatGPTSEOpromptsthatwilltransfor......
  • Java使用IntelliJ IDEA创建一个基于Swing的GUI图形化程序,打包发布为jar
    1、创建GUI窗体首先,直接新建一个默认的空的Java模块即可,随便取个名字之后再src目录下右键,新建,创建一个Swing的GUI窗体,随便取个名字给主窗体改个名字到java代码中生成一个窗......
  • [LsSDK][tool] ls_syscfg_gui 简介
    文章目录一、首先是界面介绍。二、工具的目的三、ls_gpio.h模板四、ls_syscfg.h模板五、简单讲解功能一、首先是界面介绍。二、工具的目的可视化选择IO口功能。自由配置IO......
  • JMeter 非GUI模式运行碰到的问题
    在非GUI模式,通过命令开始进行压力测试后,在命令提示框中出现了以下警告信息:MonMay1813:33:27CST2020WARN:EstablishingSSLconnectionwithoutserver'sidentity......
  • JMeter 非GUI(CLI)模式
     本文主要涉及非GUI模式的运行、生成Html报告、以及如何在非GUI模式下保存TPS等信息。1、非GUI模式相对于GUI模式即,在JMeter界面直接执行脚本,非GUI是通过命令执行测试......
  • C#:C#生成GUID
    当我们需要为某个对象生成一个唯一的标识符时,可以使用GUID(全局唯一标识符)。在C#中,可以使用 Guid.NewGuid() 方法生成一个新的GUID。下面是一个示例:  usingS......
  • gitk 使用 GUI 界面查看
    阅读目录git可视化工具GUI界面查看Windows安装Git的.gitconfig路径GITBASH下中文乱码解决办法Gitgit可视化工具在.git同级目录下,右键打开gitbash,输入gitk--al......