如何在Tkinter中使用Canvas插入图像?

时间:2018-03-15 20:50:53

标签: python tkinter tkinter-canvas

我试图在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编程的新手,有人请帮助我。

2 个答案:

答案 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)

  1. 如果仍然需要使用 Canvas 而不是 Label 来在函数或方法中放置图像,则可以使用外部链接来放置图像,并使用<函数内部此链接的strong> global 规范。
  2. 您可能需要使用SE锚,而不是NW。

此代码成功运行(从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)