【问题标题】:Tkinter: Access canvas from button handlerTkinter:从按钮处理程序访问画布
【发布时间】:2014-03-13 04:27:12
【问题描述】:

如何通过按钮调用的函数更新画布?这是我的代码:

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

按下“显示标签”按钮没有任何作用。我尝试在方法中指定画布全局,或者将画布作为参数传递(使用command = lambda (displayLabel(canvas)),两者都没有效果。我做错了什么?

更新:我现在意识到我的问题是 duplicate of this one,但 @shalitmaan 的回答以其他人没有的方式帮助了我。

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    当您将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))
    

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

    【讨论】:

    • 只需要一行就可以创建tk镜像并保存参考。 canvas.image = ImageTk.... 然后在create_image 调用中使用canvas.image。将括号添加回displayLabel,以传递参数(在您正确地表示删除它们之后)是错误的。
    猜你喜欢
    • 2017-10-05
    • 2011-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多