如何使用 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做一个下爱心雨的特效,发给妹子
如何正确使用 % include % 标签在 django 中呈现模板(如部分)?