如何创建一个响应Tkinter中的click事件的透明矩形

时间:2012-03-06 09:58:55

标签: python tkinter

我需要在tkinter.canvas中绘制一个矩形来响应click事件:

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 个答案:

答案 0 :(得分:3)

我想我明白了:绑定画布,而不是矩形。

替换

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

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

问题解决了。

答案 1 :(得分:2)

我遇到了同样的问题,尝试使用find_closest Canvas方法修改现有的矩形,但只是绑定到画布不起作用。问题是没有填充的Tkinter矩形只会响应其边框上的点击。

然后我从here了解create_rectangle的点画论点:

  

点画:指示矩形内部如何的位图   被点彩。

     

默认为stipple =“”,表示纯色。一个   典型的值是stipple ='gray25'。除非填充,否则无效   已经设置了一些颜色。 See Section 5.7, “Bitmaps”

关于位图的部分说明默认情况下只有少数点画选项可用,但它们都不是完全透明的。但是, 可以 将您自己的自定义位图指定为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
)

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