Как получить тег фигуры при нажатии - PullRequest
3 голосов
/ 29 сентября 2011

Допустим, я создал холст в приложении Tkinter.

На холсте я нарисовал несколько прямоугольников.

По сути, я хочу знать, в каком прямоугольнике щелкнул пользователь, это мое главное беспокойство, но это то, что я пробовал, и, как мне кажется, может быть решением.

Это мой макет:

for x in range(1,6):
        for y in range(1,7):     
            tableNumber = y + 6*(x-1)
            w.create_rectangle((table.xSeparation + table.width) * y - table.width,
                               (table.ySeparation + table.height) * x -  table.height,
                               (table.xSeparation + table.width)*y,
                               (table.ySeparation + table.height) * x,

                               fill="brown", tags="table" + str(tableNumber))

            w.tag_bind("table" + str(tableNumber), '<Button-1>', do)

Так что это просто создает прямоугольники в расположении строк и столбцов.

Каждый прямоугольник имеет определенный тег в виде table1, table2 до table30.

Когда я нажимаю на прямоугольник, запускается функция do.

Допустим, что-то было что-то вроде:

def do(event):
    print "click"

Не я получаю «щелчок» в консоли за каждый щелчок в прямоугольнике.

Я бы хотел иметь возможность получить метку прямоугольника, по которому щелкнули, чтобы сделать что-то вроде этого:

def do(event):
    print str(theTagOfTheClickedRectangle)

Итак, я проверил, какие события я могу назвать:

  • виджет
  • х, у
  • x_root, y_root
  • символ
  • 1039 * символ клавиши *
  • скан
  • Num
  • ширина, высота
  • тип

Кажется, ни один из пунктов не указывает, на какой прямоугольник я нажал.

Я думал о добавлении дополнительных параметров к функции do здесь:

w.tag_bind("table" + str(tableNumber), '<Button-1>', do(event, tag))

Но, похоже, это не работает нормально, но, может быть, я не правильно делаю do:

do(event, tag): #this doesn't work at all!!
    print event.x
    print tag

Надеюсь, вопрос ясен, если я получу метку таким же образом, как я могу получить 'x' и 'y' события, это будет очень удобно.

Единственное реальное решение, о котором я могу сейчас подумать, - это вычисление математики для «event.x» и «event.y» и вычисление, основываясь на координатах клика, на каком прямоугольнике щелкнул пользователь, это кажется слишком сложным для того, что я пытаюсь сделать, хотя я делал это раньше, и это, очевидно, работает.

Надеюсь, вопрос ясен, в противном случае, пожалуйста, попросите разъяснений.

Обратите внимание, что я не привязан к какому-либо из этого кода, скорее, я ищу решение этой проблемы, наиболее эффективный будет работать, даже если это означает, что не работают с тегами, или виджетом другого типа или чем-то еще тем легче.

Ответы [ 2 ]

7 голосов
/ 30 сентября 2011

Вы можете использовать что-то вроде этого для ссылки на объект, на который нажали:

event.widget.find_withtag("current")

Тег «текущий» является специальным и представляет самый верхний объект под мышью.

2 голосов
/ 29 сентября 2011
w.tag_bind("table" + str(tableNumber), '<Button-1>', do(event, tag))

следует изменить на

tag = "table" + str(tableNumber)
callback = lambda event, tag=tag: do(event, tag)
w.tag_bind(tag, '<Button-1>', callback)

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

...