如何使用 Canvas.create_image

Posted

技术标签:

【中文标题】如何使用 Canvas.create_image【英文标题】:How to use Canvas.create_image 【发布时间】:2018-10-11 08:08:08 【问题描述】:

我目前正在做一个项目,我有个坏主意,直到现在才测试我的代码。

我得到了几个错误,但我在这里只暴露其中一个,我试图将其减少到最低限度。

这是我的代码:

from tkinter import *

root = Tk()
can = Canvas(root, height = 200, width = 300, bg = "white")
can.tab = [ for k in range(5)]
nb = 0

def del(event):
    global can, nb
    can.tab[nb-1] = 
    nb -= 1

def click(event):
    global can, nb
    x,y = (event.x)//50 * 50, (event.y)//50 * 50
    can.tab[nb]['image'] = PhotoImage(master = can, file = "mouse_pointer.png", name = "mouse_pointer") #Removing the name definition makes it work
    can.create_image(x, y, anchor = NW, image = can.tab[nb]['image'])
    nb += 1

can.focus_set()
can.bind("<Button-1>", click)
can.bind("<Delete>", del)

can.pack()
root.mainloop()

这段代码的目的是创建一个画布,当你点击它时,它会在你点击的地方创建一个图像,当你按下 del 时,它会使最后创建的图像消失。

问题如下 del 他们都被删除了,而不仅仅是最后一个。

这对我的项目推进没有太大帮助,但我希望能够了解这里发生了什么。

【问题讨论】:

不要使用del 作为函数名。 del 是一个 Python 关键字,用于删除对对象的引用。 我不知道你为什么要给图片命名,但如果你给它们起不同的名字,它似乎效果更好。 我同意,但这没有任何意义!为什么一个名字会改变行为? 【参考方案1】:

有不同的场景可以满足您的需求。

这是一个想法,您可以根据自己的具体需要进行调整:

在您的位置,我将依赖 delete() 函数,该函数获取要删除的已创建图像的 id。也可以通过'all'参数来删除画布上所有已有的图片。

为了解决您的问题,您可以例如将您创建的图像的 ID(我猜是其中五个)存储到堆栈(列表或其他任何内容,如我所说,取决于您的具体情况,作为您的示例这里对我来说很模糊),然后按照 LIFO 删除它们:

from tkinter import *

root = Tk()
can = Canvas(root, height = 200, width = 300, bg = "white")
can.tab = [ for k in range(5)]
nb = 0

stack_ids = [] # added this
def bell(event):
    can.delete(stack_ids.pop()) #modified your function here

def click(event):
    global can, nb
    x,y = (event.x)//50 * 50, (event.y)//50 * 50
    can.tab[nb]['image'] = PhotoImage(master = can, file = "mouse_pointer.png", name = "mouse_pointer") 
    id = can.create_image(x, y, anchor = NW, image = can.tab[nb]['image'])
    stack_ids.append(id) # save the ids somewhere


can.focus_set()
can.bind("<Button-1>", click)
can.bind("<Delete>", bell)

can.pack()
root.mainloop()

【讨论】:

感谢您的回答!首先,实际上我的程序本身没有任何意义,我只是指出我遇到的问题,从而将代码减少到最低限度。其次,您的解决方案解决了我遇到的问题,但它并没有解释我为什么拥有它,这是我的主要目标。最后,如果您尝试使用您建议我的代码(使用小于 50px * 50px 的图像),您会发现我仍然遇到问题:当我删除图像然后尝试重新创建图像时,我收到一条错误消息,提示该图像不存在...

以上是关于如何使用 Canvas.create_image的主要内容,如果未能解决你的问题,请参考以下文章

今天七夕节,外面下着大雨,用Python的tkinter做一个下爱心雨的特效,发给妹子

代理(如 squid)如何知道连接是不是使用 http?

如何正确使用 % include % 标签在 django 中呈现模板(如部分)?

如何使用 Mockery 模拟嵌套对象,如 GuzzleHttp 请求

如何使用额外的选项(如全景)实现相机功能?

如何用radiobutton如何使用