Как обратиться к виджету, созданному пользователем? - PullRequest
0 голосов
/ 07 ноября 2019

Я использую простую функцию, которая создает прямоугольники на холсте (с размерами, указанными пользователем).

def create_some_rectangle(self):
    self.canvas.create_rectangle(master, x0, y0, x1, y1, fill='somecolor')
    # user specify x0 y0 x1 y1

Но я хочу добавить что-то для будущей адресации (выделение определенного виджета одним щелчком мыши)мыши). Было бы просто, если бы был 1 прямоугольник, но пользователь создает их много, поэтому мне нужно что-то особенное, чтобы выделить каждый виджет индивидуально.

  1. Пользователь щелкает левой кнопкой мыши на виджете
  2. Подсветка виджета
  3. Пользователь нажимает на холст (кроме выделенного виджета) и срок действия подсветки истекает

Как я мог это понять? Существуют ли какие-либо методы для этой \ какой-либо полезной идеи?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Каждый метод create_XXX дает id созданного объекта

id = canvas.create_rectangle(...)

, который можно сохранить в списке, чтобы иметь доступ ко всем объектам, когда он будет необходим.

Для измененияОпция объекта вы можете использовать это id

canvas.itemconfig(id, fill='blue')

Вы можете привязать к Canvas функцию, которая будет выполняться при нажатии левой кнопки (<Button-1>)

canvas.bind('<Button-1>', on_click)

Иэта функция получит event с позицией мыши event.x, event.y, которую вы можете использовать, чтобы найти объект на холсте

selected_id = canvas.find_overlapping(event.x, event.y, event.x+1, event.y+1)

И теперь вы можете отменить выбор всех элементов и выбрать только выбранный элемент

for id_ in all_ids:
    canvas.itemconfig(id_, fill='red')

if selected_id:
    canvas.itemconfig(selected_id, fill='blue')

import tkinter as tk

# --- functions ---

def on_click(event):
    #print(event)

    selected_id = canvas.find_overlapping(event.x, event.y, event.x+1, event.y+1)
    print(selected_id)

    for id_ in all_ids:
        canvas.itemconfig(id_, fill='red')

    if selected_id:
        canvas.itemconfig(selected_id, fill='blue')

# --- main ---

root = tk.Tk()

canvas = tk.Canvas()
canvas.pack()

canvas.bind('<Button-1>', on_click)

all_ids = []

for x in range(10, 301, 60):
    id_ = canvas.create_rectangle((x, 10, x+50, 60), fill='red')
    all_ids.append(id_)

root.mainloop()

Док: Холст

1 голос
/ 07 ноября 2019

Каждый раз, когда вы создаете объект на холсте, функция возвращает уникальный целочисленный идентификатор. Вы можете использовать этот идентификатор для ссылки на объект.

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

В вашем сценарии, когда пользователь нажимает на объект, вы можете сохранить идентификатор объекта, на котором он щелкнул. Затем вы можете использовать этот идентификатор позже, чтобы «истечь» выделение.

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