首页 > 其他分享 >tkinter画布canvas绘制图片不显示

tkinter画布canvas绘制图片不显示

时间:2024-03-22 14:33:07浏览次数:26  
标签:canvas tkinter image 画布 100 root 图片

tkinter画布canvas绘制图片不显示

首次编辑:24/3/22/13:59
最后编辑:24/3/22/14:08

原因与解决办法

在canvas中创建图片一般如下:

from tkinter import *
root = Tk()
c = Canvas(root)
# 在canvas中创建图片
image = PhotoImage(file="img/熊猫人.png")
canvas.create_image(100, 100, image = image)

c.grid()
root.mainloop()

但如果将创建图片的步骤封装在函数中:

from tkinter import *

def func(canvas):
	# 在canvas中创建图片
    image = PhotoImage(file="img/熊猫人.png")
    canvas.create_image(100, 100, image = image)

root = Tk()
c = Canvas(root)
c.grid()

func(c)
root.mainloop()

会发现图片无法显示。

原因

这是由于image这个变量定义于函数func中,属于局部变量,在函数结束之后,变量就被垃圾回收了。
create_image所指定的image参数却直接与这个被回收的变量相关,因此图片无法显示。

解决办法

只要保证image这个变量不被垃圾回收即可。
按照这个思路可以采取的办法有很多,比如将image声明为全局变量。

def func(canvas):
	# 在canvas中创建图片
	global image
    image = PhotoImage(file="img/熊猫人.png")
    canvas.create_image(100, 100, image = image)

如果是在对象的方法中创建这个图片,则可以把image变量设置为成员变量。

标签:canvas,tkinter,image,画布,100,root,图片
From: https://www.cnblogs.com/code-pigeon/p/18089408

相关文章

  • vue项目中使用html2canvas插件
    一、生成海报图vue项目中使用html2canvas插件,实现将编写的html代码转成可以保存的图片,只需要以下四步。1、在vue项目中安装插件npmihtml2canvas 2、在需要使用到的页面引入html2canvas插件importhtml2canvasfrom“html2canvas”; 3、按照设计图编写html代码<d......
  • Html2canvas——图片空白的几种排查解决方案
    问题:用html2canvas生成画布图片,再转成pdf。生成图片时内容结构里的图片显示空白。解决:首先服务器设置图片允许跨域,如阿里云腾讯云配置跨域规则。其次图片设置crossOrigin=“anonymous”,并且拿到图片地址加随机参数如src+‘?v=’+Math.random()防止使用缓存,再者html2canvas......
  • uniapp微信小程序随机生成canvas-id报错?
    uniapp微信小程序随机生成canvas-id报错?文章目录uniapp微信小程序随机生成canvas-id报错?效果图遇到问题解决场景:子组件,在mounted绘制canvas;App、H5端正常显示,微信小程序报错;效果图遇到问题随机生成canvas-id方式,控制台报错【:canvas-idattributeisun......
  • 【精选】Canvas 事件处理系统 - 多图长文
    文章目录Canvas事件处理系统为什么我们需要事件处理系统系统搭建抽象图形画布类像素问题使用示例判断事件发生的图形CanvasRenderingContext2D.isPointInPath()Geometry圆矩形线段多边形OffscreenCanvas更多事件类型对比参考Canvas事件处理系统是我自己的一......
  • Canvas 控件
    在C#中中设置控件坐标Labellabel=newLabel{Content="测试",FontSize=14,Foreground=newSolidColorBrush((Color)ColorConverter.ConvertFromString("#FF0000"))};Canvas.SetTop(label,10.9);//在c#后台代码中动态设置Canvas.SetLeft(label,......
  • Boostrap5通过JS控制Offcanvas的显示隐藏
    涉及的技术栈vue3vitebootstrap5背景在用bootstrap5的时候遇到一个问题,就是offcanvas在nav上的时候居然会有两个背景BackDrop,关闭之后页面上还有一个backdrop留在那bootstrap5文档里面提供了几个Method可以控制Offcanvas实例的显示隐藏,但是不会用复现问题点击offcan......
  • Canvas 封装
    Canvas封装记录一个Canvas封装,这个是给小程序用的,html可以直接用html2canvas,且不说小程序有没有对应的东西,小程序这原生的东西对于第三方框架都不一定有用,毕竟小程序就是一坨,用不了带document的东西,啥新特性都没有,还一堆bug不修这里使用的是Tarovue3typescript,用别的框架把Ta......
  • 通过canvas实现鼠标绘图的注意点
    问题情景:想设置全屏canvas时,直接修改了canvas的css样式为width:100%。出现问题:绘图时坐标不对应且有明显放大感。问题原因:css中width是将canvas尺寸直接放大,而实际需要的是修改canvas本身的尺寸。解决办法:直接定义canvas.width和canvas.height。我用的是vue3所以用了onMount......
  • tkinter,点击button显示图片,
    tkinter,点击button显示图片,图片指定尺寸,等比缩放显示。  importtkinterastkfromPILimportImage,ImageTk#创建一个窗口window=tk.Tk()window.title("点击显示图片")#创建一个Button按钮button=tk.Button(window,text="点击我",command=lambda:show_......
  • 将tk/tkinter的默认ico改变
    打包后的exe默认tk的ico,太丑了直接按照这个步骤改就完事了第一步importbase64open_icon=open("qq.ico","rb")#qq.icon为你要放入的图标b64str=base64.b64encode(open_icon.read())#以base64的格式读出open_icon.close()write_data="img=%s"%b64strf=op......