Python / Tkinter Как правильно фиксировать щелчки мышью в контекстном меню?

У меня есть холст, куда я могу загружать изображения и тексты. Чтобы переместить их и сделать несколько правок, я использую функцию find_withtag (CURRENT), поскольку, когда вы помещаете указатель на объект, вы добавляете тег CURRENT и, таким образом, можете редактировать объект, на котором находится указатель. Но имея контекстное меню (всплывающее меню) при щелчке правой кнопкой мыши и содержащее несколько опций, например, если в конце меню есть опция «Удалить элемент», использовать find_withtag невозможно. Я объясняю себя, я щелкаю правой кнопкой мыши на элементе, чтобы вызвать контекстное меню на нем с параметрами, но при перемещении указателя на нужный параметр иногда указатель больше не находится на рассматриваемом объекте и оказывается на другом или в пустом пространстве холста и при щелчке на опции он больше не выполняется, потому что указатель должен был быть перемещен к опции за пределами области над объектом. Как это можно решить?

Пример кода: мы берем это из окна как очевидное ...

# Creo el canvas
global canvas
canvas = tk.Canvas(main, width=cw, height=ch, bg="white", cursor="arrow",
                   selectbackground="red", selectborderwidth=1, selectforeground="cyan")
canvas.pack(expand=True, fill=BOTH)

# Función para abrir una imagen y colocarla en el canvas, le agrego el tag
# "SEL" para otra función sobre la imagen 

def abrir1(main):
    global image1
    try:
        pic = tkFileDialog.askopenfilename(initialdir="../")
        canvas.image1 = ImageTk.PhotoImage(file = pic)
        canvas.create_image(cw/2,ch/2, anchor=CENTER, image=canvas.image1, tags=SEL)
    except:
        pass

# Creo una de las funciones para el menú contextual, en este caso la de borrar una imagen
def borraim(main):
    try:
        canvas.find_withtag(CURRENT) # Aquí detecta a la imagen y le da el tag "CURRENT"
        canvas.delete(CURRENT)
    except:
        pass

# Creo el menú pop-up o contextual que aparecerá al dar clic derecho
# en cualquier parte del canvas, mostrando varias opciones:

menu = Menu(main, tearoff=0)
menu.focus()
menu.add_command(label="Traer al frente", command=lambda:adelante(main))
menu.add_command(label="Enviar al fondo", command=lambda:atras(main))
menu.add_separator()
menu.add_command(label="Borrar", command=lambda:borraim(main))

def popup(event):
    menu.post(event.x_root, event.y_root)

# attach popup to frame
main.bind("<Button-3>", popup)

Так, например, если я хочу удалить изображение, я щелкаю правой кнопкой мыши по изображению, и отображается меню, но чтобы перейти к последнему пункту меню, я должен переместить указатель на него и нажать кнопку оставленный, тогда, поскольку указатель, возможно, больше не находится на изображении (потому что я переместил его к опции), он больше не обнаруживает изображение с помощью find_withtag (CURRENT) и ничего не делает, когда щелкает или обнаруживает объект, момент которого в позиции, где находится опция меню, и выполните эту опцию для этого объекта, а не для исходного изображения. Я не знаю, есть ли другой тип функции для ее правильного выполнения на объекте, который изначально был нажат правой кнопкой мыши.

0
задан 22.12.2016, 19:00
0 ответов

Ты можешь сохранять статью, на которую он указывает CURRENT развернув меню в глобальной переменной:

def popup(event):
    global current_item
    try:
        current_item = canvas.find_withtag(CURRENT)[0]
    except IndexError:
        current_item = None
    menu.post(event.x_root, event.y_root)

def borraim(main):
    try:
        canvas.delete(current_item)
    except:
        pass

Если ты предпочитаешь, чтобы меню не развернулось на пустых зонах только, ты должен включать это в try:

def popup(event):
    global current_item
    try:
        current_item = canvas.find_withtag(CURRENT)[0]
        menu.post(event.x_root, event.y_root)
    except IndexError:
        current_item = None
0
ответ дан 03.12.2019, 18:24

Теги

Похожие вопросы