news 2026/5/1 8:46:44

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

作者头像

张小明

前端开发工程师

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/5/1 3:45:32

TouchGal视觉小说社区:打造沉浸式Galgame文化交流平台

在数字娱乐蓬勃发展的今天,TouchGal社区以其独特的定位和技术优势,为全球Galgame爱好者构建了一个专属的交流平台和资源共享空间。这个现代化的视觉小说社区不仅提供了丰富的游戏资源,更创造了深度互动的文化氛围。 【免费下载链接】kun-touc…

作者头像 李华
网站建设 2026/5/1 5:44:20

OmenSuperHub:暗影精灵笔记本的离线性能控制中心

还在为官方软件的强制联网和不必要的内容推送而烦恼吗?OmenSuperHub为您提供完全离线的暗影精灵笔记本性能优化解决方案。这款开源工具专注于硬件管理和性能调优,通过智能风扇控制和性能模式切换,让您的笔记本在最佳状态下运行,同…

作者头像 李华
网站建设 2026/5/1 9:31:57

舞蹈编排创意助手: choreographer 获取动作组合建议

舞蹈编排创意助手:choreographer 获取动作组合建议 在现代舞剧《春之祭》的排练厅里,一位年轻编导正为如何表现“群体觉醒”这一抽象主题而焦头烂额。她尝试了多种肢体语言,却始终难以突破既有的表达框架。如果此时能有一个懂舞蹈理论、熟悉…

作者头像 李华
网站建设 2026/5/1 4:49:00

vivado除法器ip核配置参数详解:全面讲解设置选项

Vivado除法器IP核配置全解析:从参数意义到实战调优在FPGA开发中,数学运算模块的实现从来都不是“理所当然”的事。尤其是在需要频繁进行比例计算、归一化处理或动态增益调整的系统里,除法操作往往成为性能瓶颈——它不像加法和乘法那样能被综…

作者头像 李华
网站建设 2026/5/1 4:46:11

如何快速上手PC微信Hook开发:打造专属微信机器人的完整指南

如何快速上手PC微信Hook开发:打造专属微信机器人的完整指南 【免费下载链接】wechatPc PC微信hook源码,PC微信注入,逆向编程,可以制作微信机器人玩玩,仅供学习,请不要用于商业、违法途径,本人不…

作者头像 李华
网站建设 2026/5/1 4:48:02

暗影精灵终极控制方案:OmenSuperHub完整指南与深度解析

暗影精灵终极控制方案:OmenSuperHub完整指南与深度解析 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 还在为惠普暗影精灵笔记本官方控制软件的种种限制而烦恼吗?网络连接要求、广告干扰、资源占用过…

作者头像 李华