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