Как определить и удалить рисунок холста tkinter с помощью тегов, хранящихся в списке тегов? - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь удалить прямоугольник с холста с помощью второго нажатия кнопки, используя список тегов. Смотрите функцию «insert_or_delete_cells» ниже. Хотя код поддерживает актуальность списка тегов, он не удаляет сам прямоугольник с холста. Из операторов печати видно, что код не получает идентификатор прямоугольника, поэтому ничего не удаляется. Как улучшить этот код?

import tkinter as tk

def insert_or_delete_cells():
    def xyposition(event):
        x = canvas.canvasx(event.x)
        y = canvas.canvasy(event.y)
        x_matrix=int(x//cell)
        y_matrix=int(y//cell)
        x0 = x_matrix*cell+1
        y0 = y_matrix*cell+1
        mark = str(x_matrix)+str(y_matrix)
        c = cell-1
        if mark not in tags_list:
            rect = canvas.create_rectangle(x0,y0,x0+c,y0+c, width=0, fill='green', tags = mark)
            tags_list.append(mark)
            print('new cell id: ', rect, 'new cell tag: ', mark)
        else:
            r=canvas.find_withtag(mark)
            print('removed cell id: ', r, 'removed cell tag: ', mark)
            canvas.delete(mark) # canvas.delete(r) doesn't work neither
            tags_list.remove(mark)
    canvas.bind("<Button-1>", xyposition)

def stop_insert_cells():
    canvas.unbind('<Button-1>')

# MAIN
root = tk.Tk()
root.geometry("400x400")
n=30
m=30
cell=10
w = n*cell
h = m*cell

# canvas
canvas = tk.Canvas(root,width = w, height = h, borderwidth = 0, highlightthickness=0)
canvas.place(x=20, y=20)

# border canvas
canvas.create_rectangle(0,0,w-1,h-1, outline = 'black')

# cell filling
tags_list = []
start_insert_button = tk.Button(root, text='start', command = insert_or_delete_cells)
stop_insert_button = tk.Button(root, text = 'stop', command = stop_insert_cells)

stop_insert_button.pack(side='bottom')
start_insert_button.pack(side='bottom')

root.mainloop()

1 Ответ

0 голосов
/ 23 февраля 2020

Когда вы создаете тег, вы используете строки, которые выглядят как целые числа. Теги могут быть чем угодно , за исключением строк, которые выглядят как целые числа, поскольку tkinter не будет знать, ссылаетесь ли вы на тег или идентификатор элемента.

Ваш код будет работать, если вы убедитесь, что mark состоит не только из цифр. Например, изменение определения mark на что-то вроде следующего позволит вашему коду работать:

    mark=f"mark-{x_matrix},{y_matrix}"

Из канонической документации tcl / tk:

Каждый элемент может также иметь любое количество тегов, связанных с ним. Тег - это просто строка символов, и может принимать любую форму, кроме целого числа . Например, «x123» в порядке, а «123» - нет. Один и тот же тег может быть связан со многими различными элементами. Обычно это делается для группировки предметов различными интересными способами; например, всем выделенным элементам может быть присвоен тег «выбранный».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...