Python Tkinter:从按钮处理程序访问画布

Python Tkinter:从按钮处理程序访问画布,python,tkinter,Python,Tkinter,如何从按钮调用的函数更新画布?这是我的密码: from Tkinter import * import ImageTk tk = Tk() canvas = Canvas(tk, bg="white", width=300, height=200) canvas.grid() def displayLabel(): photoimage = ImageTk.PhotoImage(file="Logo.png") canvas.create_image(0,0, image=p

如何从按钮调用的函数更新画布?这是我的密码:

from Tkinter import *
import ImageTk

tk = Tk()
canvas = Canvas(tk, bg="white", width=300, height=200)
canvas.grid()

def displayLabel():
    photoimage = ImageTk.PhotoImage(file="Logo.png")
    canvas.create_image(0,0, image=photoimage, anchor = NW)

b3 = Button(tk, text="Display Label", width=30, command= displayLabel())
b3.grid(row=1)

tk.mainloop()
按下“显示标签”按钮不起任何作用。我尝试在方法中指定画布全局,或将画布作为参数传入(使用
命令=lambda(displayLabel(canvas))
,但均无效。我做错了什么


更新:我现在意识到我的问题是一个,但是@shalitmaan的回答帮助了我,而另一个没有。

当你在Tkinter小部件中添加一个
PhotoImage
或其他图像对象时,你必须保留你自己对图像对象的引用。如果你不这样做,图像不会总是显示出来。 以下是我想说的:

def displayLabel():
    photoimage = ImageTk.PhotoImage(file="lena.png")
    canvas.create_image(0,0, image=photoimage, anchor = NW)
    canvas.image=photoimage #keep the reference!
我是从学校学的

另外您需要删除括号
()

否则,即使不按按钮也会直接调用它。您可能直到现在才注意到它,因为
Tk
只是将图像变为空白,您现在可以从链接中了解到这一点

如果要将一些参数发送到
displayLabel
,则需要使用
lambda
。例如:

b3 = Button(tk, text="Display Label", width=30, command= lambda:displayLabel(args))

在您提出的问题中,您缺少冒号

创建tk图像并保存引用只需一行。
canvas.image=ImageTk….
然后在
create\u image
调用中使用
canvas.image
。将括号添加回
displayLabel
,以传递参数(在你正确地说移除它们之后)是错误的。
b3 = Button(tk, text="Display Label", width=30, command= lambda:displayLabel(args))