0.前言
最近因为写课设(聊天室系统),需要在tkinter的text组件中插入图片,在网上查阅了很多资料并没有找到这方面的内容,最后通过仔细阅读官方文档,找到了这方面的内容,并且跳了很多坑,所以决定来水一篇文章。
附上官方文档地址:
tkinter之text官方文档
1.插入图片
要在text中插入图片,需要用到image_create(index, cnf={}, **kw) 这个方法。具体的一个例子请看下面。
from tkinter import *
root = Tk()
text = Text(root)
photo = PhotoImage(file='./emoji_file/a1.GIF')
text.image_create(END, image=photo)#用这个方法创建一个图片对象,并插入到“END”的位置
text.pack()
root.mainloop()
运行结果:
与图片操作有关的一些方法:
(1)image_cget(index, option=),返回option后面给定的参数的值,option可以等于file,name,ganma等参数。
(2)image_configure(index, **options),option可选的参数同上,此外还可以设置align、image、name、padx、pady等参数的值。
(3)image_names(),返回图片的名称。
(4)没有其他的方法了,毕竟用这个组件去操作图片用的不多。
注意
1.使用这个方法创建的图片对象使用的索引(指的是END,CURRENT等index属性)与插入文字时的索引不是同一个,如果需要按照一定的索引位置插入图片,需要自行创建一个mark对象。
2.这个方法只能插入GIF图片,如果需要插入其他种类的图片,需要使用PIL库中的ImageTk方法进行转换,下面是官方文档给出的一个例子
from PIL import Image, ImageTk
image = Image.open("lenna.jpg")
photo = ImageTk.PhotoImage(image)
2.遇到的问题
个人觉得使用tkinter这个库时经常会遇到一些奇怪的问题,建议只要有一点小的问题都应该去stackflow上查一下,很多时候一些问题你是想不到的。官方文档给出的东西很少,你不可能通读一遍文档再去写代码。
比如,如果你使用Tk()初始化了一个窗体之后,再使用TK()初始化另一个窗体,没问题。但是如果你在第二个Tk()中创建了text组件,并且准备在这个组件中去添加图片的时候,会报一个错误。
tkinter.TclError: image “pyimage” doesn’t exist
stackoverflow上给出的解释是不能使用两次Tk()去创建窗体,因为tkinter中只能有一个主线程,当你需要再次创建一个窗体时,请使用Toplevel()。