как создать прозрачный прямоугольник, отвечающий на событие нажатия в Tkinter - PullRequest
3 голосов
/ 06 марта 2012

Мне нужно нарисовать прямоугольник в tkinter.canvas, чтобы ответить на событие клика:

click_area = self.canvas.create_rectangle(0,0,pa_width,pa_height,fill='LightBlue',outline='lightBlue',tags=['A','CLICK_AREA'])
self.canvas.tag_bind('CLICK_AREA','<Button>',self.onClickArea)

это работает.

в этот момент мне нужно нарисовать на сетке серию сеток, и я хочу, чтобы они были покрыты click_area, так что мне нужно сделать click_area прозрачным.

но, когда я написал так:

click_area = self.canvas.create_rectangle(0,0,pa_width,pa_height,fill='',outline='lightBlue',tags=['A','CLICK_AREA'])

он не ответил больше на клик.

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

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Мне кажется, я понял: связать холст, а не прямоугольник.

замена

self.canvas.tag_bind('CLICK_AREA','<Button>',self.onClickArea)

с

self.canvas.bind('<Button>',self.onClickArea)

проблема решена.

2 голосов
/ 19 августа 2016

Я сталкивался с этой же проблемой, пытаясь использовать метод find_closest Canvas для изменения существующих прямоугольников, но просто привязка к холсту не работала. Проблема в том, что прямоугольник Tkinter без заливки будет реагировать только на щелчки на его границе.

Затем я прочитал об аргументе stipple для create_rectangle из здесь :

stipple: Растровое изображение, показывающее, как внутренность прямоугольника будет быть пунктирным.

По умолчанию используется stipple = "", что означает сплошной цвет. типичное значение будет пунктирная = 'grey25'. Не имеет эффекта, если не заполнить был установлен в какой-то цвет. См. Раздел 5.7, «Растровые изображения» .

А в разделе о растровых изображениях говорится, что по умолчанию доступны только несколько опций пунктирной линии, но ни одна из них не является полностью прозрачной. Однако вы можете указать свое собственное растровое изображение в виде растрового изображения X (файл .xbm).

Файлы XBM на самом деле являются просто текстовыми файлами с синтаксисом, подобным C, поэтому я создал свой собственный растровый рисунок 2x2 со всеми прозрачными пикселями и сохранил его как transparent.xbm в той же директории, что и мой скрипт Tkinter. Вот код для файла XBM:

#define trans_width 2
#define trans_height 2
static unsigned char trans_bits[] = {
   0x00, 0x00
};

Затем вы можете указать пользовательский пунктир, добавив к имени файла xbm @ при создании прямоугольника:

self.canvas.create_rectangle(
    x1,
    y1,
    x2,
    y2,
    outline='green',
    fill='gray',  # still needed or stipple won't work
    stipple='@transparent.xbm',
    width=2
)

Обратите внимание, вам все равно необходимо указать некоторое значение заполнения, иначе пункт не будет применен. Фактическое значение заполнения не имеет значения, так как пунктирная линия «переопределит» его на холсте.

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