Я сталкивался с этой же проблемой, пытаясь использовать метод 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
)
Обратите внимание, вам все равно необходимо указать некоторое значение заполнения, иначе пункт не будет применен. Фактическое значение заполнения не имеет значения, так как пунктирная линия «переопределит» его на холсте.