如何使用Canvas.create_image

时间:2018-05-01 09:06:59

标签: python canvas tkinter

我目前正在开展一个项目,直到现在我还没想过不测试我的代码。

我已经获得了几个错误,但我在这里只暴露了其中一个,我试图将其减少到最小值。

这是我的代码:

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

此代码的目的是创建一个Canvas,当您单击时,它会创建一个您单击的图像,当您按del时,它会使最后一个图像消失。< / p>

问题如下如果我没有为我的图片命名,它可以正常工作,但是当我给他们一个名字时(他们都有相同的名字!),当我按下时del他们都被删除而不是只删除最后一个。

这对我的项目进展没有多大帮助,但我希望能够理解这里发生的事情。

1 个答案:

答案 0 :(得分:0)

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

这是一个想法,您可以根据您的确切需要进行调整:

在您的位置,我会依赖delete()函数来删除创建的图像的ID。它还可用于通过传递&#39; all&#39;删除画布上的所有现有图像。参数。

要解决您的问题,您可以将您创建的图像的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()