python - Tkinter:从按钮处理程序访问 Canvas

标签 python tkinter

如何通过按钮调用的函数更新 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/

相关文章:

python - 如何删除 tkinter 中的小部件?

python - pandas 中的 groupby() 和索引值

python - SQL 数据库查询 - 返回包含列表中所有值的记录 (Python)

python - 协程在读/写共享资源时是否需要锁?

python - 从 Splash 请求中读取 cookie

python - 当按下按钮时,什么也没有发生。甚至没有错误消息

python - 获取数组中按钮的索引(按下时)

python - Tkinter 托盘图标(winico、twapi、pywin32)

python - 将矩阵负值更改为绝对值

python - Django 模板 - 在哪里编码以查找此特定模板?