Как предать данные с объектом Canvas?
Вот цикл, который создает объекты Canvas и заполняет их данными из массива:
'''
for product in products:
if countColumn == int(width):
countRow = countRow + 1
countColumn = 0
# bg = bgColor[str(product[9])]
canvas = Canvas(self, width=300, height=150, bg=str(bgColor[str(product[9])]))
canvas.grid(in_=contLIST, row=countRow, column=countColumn)
canvas.create_text(5, 5, text=str(product[0]), anchor=NW, font="Verdana 12") #, fill="green")
canvas.create_text(200, 15, text=str(typeProd[str(product[12])]), justify=CENTER, font="Verdana 12")
canvas.create_text(15, 35, text=product[3] + " " + product[4], anchor=W, font="Verdana 10 bold")
img = ImageTk.PhotoImage(Image.open("img/type" + str(product[12]) + ".png"))
canvas.image = img
canvas.create_image(50, 100, image=img)
if str(product[10]) == "None":
master = ""
canvas.create_text(200, 70, text=master, font="Verdana 12") # s[s.find(":") + 1:]
canvas.create_text(200, 95, text=str(product[7])[str(product[7]).find(":") + 5:], font="Verdana 12 bold")
canvas.create_text(200, 120, text=str(product[1].strftime('%Y-%m-%d')), font="Verdana 12")
self.data = product[0]
canvas.bind("<Button-1>", lambda event: self.openProduct(self.data))
countColumn = countColumn + 1
'''
По клику мне нужно передать порядковый номер объекта, который отработал bind. Но lambda event у любого из созданных объектов Canvas отправляет только последний порядковый номер из массива.
Ответы (1 шт):
Автор решения: VerahuK
→ Ссылка
Разобрался!
Для начала в строке canvas.bind("<Button-1>", lambda event: self.openProduct(self.data)) вместо self.data нужно передать event.
команда event.widget возвращает порядковый номер виджета, по которому был клик. Преобразовал в строку, с помощью split отрезал порядковый номер виджета. Но у самого первого порядковый номер не ставится, поэтому пришлось 0 присваивать через условие.
def openProduct(self, event):
spl = str(event.widget).split("canvas")
if spl[1] == "":
canvaId = 0
else:
canvaId = int(spl[1] - 1)
array = self.arrayOK[canvaId]
print(array)