news 2026/1/17 9:37:11

画面闪烁的解决办法——双缓冲技术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
画面闪烁的解决办法——双缓冲技术

UI更新闪烁的解决办法——双缓冲技术

  • 前置内容
    • Canvas组件的图像初始化
    • Canvas组件的图像动态更新
  • 双缓冲技术

最近项目需要动态更新tkinter的Canvas组件的图片,出现画面闪烁现象,用双缓冲技术解决了。

前置内容

Canvas组件的图像初始化

可以调用Canvas的create_image方法完成其图像初始化,此方法返回一个句柄,后面可以利用此句柄更新Canvas的图像。

# coding=utf-8fromtkinterimportTk,CanvasfromPILimportImage,ImageTkimportnumpyasnpdefrandom_img():returnImageTk.PhotoImage(Image.fromarray(np.random.randint(0,255,(480,640),dtype=np.uint8)))if__name__=='__main__':root_wd=Tk()root_wd.geometry("640x480")root_wd.title("Dynamic change canvas images")root_wd.minsize(640,480)canvas=Canvas(root_wd,width=640,height=480)canvas.place(x=0,y=0)img=random_img()canvas.img_id=canvas.create_image(320,240,image=img)root_wd.mainloop()

Canvas组件的图像动态更新

可以调用Canvas的itemconfig方法完成动态更新,需要用到create_image方法返回的句柄。

# coding=utf-8fromtkinterimportTk,CanvasfromPILimportImage,ImageTkfromthreadingimportThreadimportnumpyasnpfromtimeimportsleepdefrandom_img():returnImageTk.PhotoImage(Image.fromarray(np.random.randint(0,255,(800,1280),dtype=np.uint8)))defupdate(canvas:Canvas):whileTrue:img=random_img()canvas.itemconfig(canvas.img_id,image=img)sleep(.05)if__name__=='__main__':root_wd=Tk()root_wd.geometry("1280x800")root_wd.title("Dynamic change canvas images")root_wd.minsize(1280,800)canvas=Canvas(root_wd,width=1280,height=800)canvas.place(x=0,y=0)img=random_img()canvas.img_id=canvas.create_image(640,400,image=img)Thread(target=update,args=(canvas,),daemon=True).start()root_wd.mainloop()

运行上面这份脚本可以看到画面闪烁的现象。

双缓冲技术

上面闪烁的本质原因是Canvas的帧数据提前释放了。双缓冲技术始终保持了上一帧和当前帧的引用,避免提前释放,直接上代码看效果:

# coding=utf-8fromtkinterimportTk,CanvasfromPILimportImage,ImageTkfromthreadingimportThreadimportnumpyasnpfromtimeimportsleep buf1,buf2,curr=None,None,Nonedefrandom_img():returnImageTk.PhotoImage(Image.fromarray(np.random.randint(0,255,(480,640),dtype=np.uint8)))defupdate(canvas:Canvas,canvas2:Canvas,buf1:ImageTk,buf2:ImageTk,curr:ImageTk):whileTrue:ifcurrisbuf1:buf2=random_img()else:buf1=random_img()curr=buf1ifcurrisbuf2elsebuf2 img=random_img()canvas1.itemconfig(canvas1.img_id,image=img)canvas2.itemconfig(canvas2.img_id,image=curr)sleep(.05)if__name__=='__main__':root_wd=Tk()root_wd.geometry("1280x480")root_wd.title("Dynamic change canvas images")root_wd.minsize(640,480)canvas1=Canvas(root_wd,width=640,height=480)canvas1.place(x=0,y=0)canvas2=Canvas(root_wd,width=640,height=480)canvas2.place(x=640,y=0)curr=buf1=random_img()buf2=random_img()canvas1.img_id=canvas1.create_image(320,240,image=curr)canvas2.img_id=canvas2.create_image(320,240,image=curr)Thread(target=update,args=(canvas1,canvas2,buf1,buf2,curr),daemon=True).start()root_wd.mainloop()

可以看到右边用了双缓冲技术的Canvas不闪烁

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/12 11:16:25

PPTist全栈配置手册:零基础打造专业级在线演示平台

PPTist全栈配置手册:零基础打造专业级在线演示平台 【免费下载链接】PPTist 基于 Vue3.x TypeScript 的在线演示文稿(幻灯片)应用,还原了大部分 Office PowerPoint 常用功能,实现在线PPT的编辑、演示。支持导出PPT文件…

作者头像 李华
网站建设 2026/1/16 0:21:25

1、AWS自动化:从版本控制到持续部署的全面指南

AWS自动化:从版本控制到持续部署的全面指南 1. 引言 在当今的软件开发领域,持续集成(CI)和持续部署(CD)已经成为了提高软件交付效率和质量的关键实践。AWS(Amazon Web Services)提供了一系列强大的服务,能够帮助企业实现快速、可靠的软件构建和部署流程。本文将深入…

作者头像 李华
网站建设 2026/1/11 15:49:30

10、微服务、ECS与容器化应用的持续部署实践

微服务、ECS与容器化应用的持续部署实践 在容器化应用的部署与管理中,AWS提供了一系列强大的服务,如ECR、ECS等。本文将介绍如何使用这些服务来部署静态应用,并实现容器化应用的持续部署。 1. Docker镜像标签与推送至ECR 首先,我们需要给 webapp 镜像打标签,不过ECR的…

作者头像 李华
网站建设 2025/12/30 23:58:23

如何在Windows系统快速安装安卓应用:APK Installer终极教程

如何在Windows系统快速安装安卓应用:APK Installer终极教程 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 还在为Windows电脑无法直接运行手机应用而烦恼吗…

作者头像 李华
网站建设 2026/1/16 10:39:16

11、使用开发工具和CloudFormation实现向ECS的持续部署

使用开发工具和CloudFormation实现向ECS的持续部署 在当今的软件开发中,持续部署是提高效率和质量的关键。本文将详细介绍如何使用AWS的开发工具和CloudFormation实现向ECS(Elastic Container Service)的持续部署。 工作流程概述 整个工作流程如下: 1. 代码推送 :应…

作者头像 李华