Как использовать Canvas.create_image - PullRequest
0 голосов
/ 01 мая 2018

Я сейчас работаю над проектом, и у меня была плохая идея не проверять мой код до сих пор.

Я получил несколько ошибок, но выставляю здесь только одну из них, которую я пытался свести к минимуму.

Вот мой код:

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 все они удаляются, а не только последний.

Это не очень поможет мне в продвижении моего проекта, но я бы хотел понять, что здесь происходит.

1 Ответ

0 голосов
/ 01 мая 2018

Существуют разные сценарии для выполнения того, что вы ищете.

Это идея, вы можете адаптировать ее под свои нужды:

На вашем месте я бы положился на функцию delete(), которая принимает идентификатор созданного изображения, которое нужно удалить. Он также может использоваться для удаления всех существующих изображений на холсте с помощью параметра «all».

Чтобы решить вашу проблему, вы можете, например, складывать идентификаторы созданных вами изображений (пять из них, я думаю) в стек (список или что-то еще, в зависимости, как я уже говорил, от вашего конкретного случая, в качестве вашего примера вот это довольно расплывчато для меня), а затем удалите их после 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...