如何在Tkin中创建响应click事件的透明矩形

2024-06-10 15:12:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在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'])

它不再对单击做出响应。

所以,我的问题是如何使它透明,并保持它对click的响应。或者,有没有其他方法来实现我想要的。

非常感谢。


Tags: selfcreate绘制areawidthfilllightbluecanvas
2条回答

我想我明白了:把画布绑起来,而不是长方形。

替换

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

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

问题解决了。

我在尝试使用find_closestCanvas方法修改现有矩形时遇到了同样的问题,但是仅仅绑定到画布是行不通的。问题是,没有填充的Tkinter矩形只会响应其边界上的单击。

然后我从here中了解到create_rectangle的点画参数:

stipple: A bitmap indicating how the interior of the rectangle will be stippled.

Default is stipple="", which means a solid color. A typical value would be stipple='gray25'. Has no effect unless the fill has been set to some color. See Section 5.7, “Bitmaps”.

位图部分指出,默认情况下只有几个点画选项可用,但没有一个是完全透明的。但是,您可以将自己的自定义位图指定为X位图图像(a.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
)

注意,您仍然需要提供一些填充值,否则点画将不会应用。实际的填充值无关紧要,因为点画将在画布中“覆盖”它。

相关问题 更多 >