我试图在tkinter中使用Canvas在我的python应用程序中插入一个图像。相同的代码是:
class Welcomepage(tk.Frame):
def __init__(self, parent, controller):
tk.Frame.__init__(self,parent)
canvas = tk.Canvas(self, width = 1000, height = 1000, bg = 'blue')
canvas.pack(expand = tk.YES, fill = tk.BOTH)
image = tk.PhotoImage(file="ice_mix.gif")
canvas.create_image(480, 258, image = image, anchor = tk.NW)
图像从源中读取但仍未显示在框架中。我是GUI编程的新手,有人请帮助我。
答案 0 :(得分:1)
这里可能出现的问题是图像被Python垃圾收集,因此没有被显示 - 这正是@ nae的评论所暗示的。将它附加到self
引用将阻止它被垃圾收集。
effbot.org上的Tkinter Book解释了这一点:
注意:当Python对垃圾收集PhotoImage对象时(例如 当您从在本地存储图像的函数返回时 变量),即使正在显示图像,图像也会被清除 Tkinter小部件。
为避免这种情况,程序必须对图像保留额外的引用 宾语。一种简单的方法是将图像分配给窗口小部件 属性,像这样:
label = Label(image=photo) label.image = photo # keep a reference! label.pack()
答案 1 :(得分:1)
此代码成功运行(从USB相机获取OpenCV图像并将其放置在Tkinter Canvas 中):
def singleFrame1():
global imageTK # declared previously in global area
global videoPanel1 # also global declaration (declared as "None")
videoCapture=cv2.VideoCapture(0)
success,frame=videoCapture.read()
videoCapture.release()
vHeight=frame.shape[0]
vWidth=frame.shape[1]
imageRGB=cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) # OpenCV RGB-image
imagePIL=Image.fromarray(imageRGB) # PIL image
imageTK=ImageTk.PhotoImage(imagePIL) # Tkinter PhotoImage
if videoPanel1 is None:
videoPanel1=Canvas(root,height=vHeight,width=vWidth) # root - a main Tkinter object
videoPanel1.create_image(vWidth,vHeight,image=imageTK,anchor=SE)
videoPanel1.pack()
else:
videoPanel1.create_image(vWidth,vHeight,image=imageTK,anchor=SE)