如何通过按钮调用的函数更新 Canvas ?这是我的代码:
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()
按“显示标签”按钮不会执行任何操作。我尝试在方法中指定 Canvas 全局,或者将 Canvas 作为参数传递(使用 command = lambda (displayLabel(canvas)) ),但都没有效果。我做错了什么?
更新:我现在意识到我的问题是 duplicate of this one ,但是 @shalitmaan 的回答以其他人没有的方式帮助了我。
最佳答案
当您将 PhotoImage
或其他 Image 对象添加到 Tkinter 小部件时,您必须保留自己对图像对象的引用。如果不这样做,图像将不会总是显示。
这基本上就是我想说的:
def displayLabel():
photoimage = ImageTk.PhotoImage(file="lena.png")
canvas.create_image(0,0, image=photoimage, anchor = NW)
canvas.image=photoimage #keep the reference!
我是从here学到的.
此外您需要删除括号()
b3 = Button(tk, text="Display Label", width=30, command= displayLabel) #no parenthesis
否则,即使按下按钮,也会直接调用。直到现在您可能还没有注意到它,因为 Tk
只是将图像设为空白,正如您现在可以从链接中了解到的那样。
另外如果您想向 displayLabel
发送一些参数,您需要使用 lambda
。例如:
b3 = Button(tk, text="Display Label", width=30, command= lambda:displayLabel(args))
在您提出的问题中,您缺少冒号:
关于python - Tkinter:从按钮处理程序访问 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22369075/