Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter-获取标签对象的x、y坐标_Python_Tkinter - Fatal编程技术网

Python Tkinter-获取标签对象的x、y坐标

Python Tkinter-获取标签对象的x、y坐标,python,tkinter,Python,Tkinter,我已将标签对象定义为: panel = Label(image_frame, image=self.img, cursor="cross") 现在,我想在上面画一个多边形,我创建了一个名为draw()的函数,它绑定到画布上,允许我在画布上画一个多边形。因此,我知道我的draw()命令是有效的 但是,我需要在我定义为标签的面板顶部执行此操作。 我遇到的最大问题是draw()命令中的这一行 if event.widget.canvasx(event.x)-2 < orig_x < ev

我已将
标签
对象定义为:

panel = Label(image_frame, image=self.img, cursor="cross")
现在,我想在上面画一个多边形,我创建了一个名为
draw()
的函数,它绑定到画布上,允许我在画布上画一个多边形。因此,我知道我的
draw()
命令是有效的

但是,我需要在我定义为标签的面板顶部执行此操作。 我遇到的最大问题是
draw()
命令中的这一行

if event.widget.canvasx(event.x)-2 < orig_x < event.widget.canvasx(event.x)+2 and event.widget.canvasy(event.y)-2 < orig_y < event.widget.canvasy(event.y)+2 :
if event.widget.canvasx(event.x)-2
我产生以下错误:

AttributeError:“Label”对象没有属性“canvasx”

对于
Label
对象,是否有类似的
canvasx
?如何在不更改标签的情况下绕过此选项?还是将标签更改为画布是我唯一的选择

我唯一能想到的另一件事是在
标签
后面有一个透明的画布,但是
在调整大小
时,事情变得一团糟

标签对象是否有画布模拟?如何在不更改标签的情况下绕过此选项?还是将标签更改为画布是我唯一的选择

不,因为没有必要
canvasx
之所以存在,是因为画布可以向任何方向滚动,并且您需要能够从小部件坐标转换为内部画布坐标

对于标签,如果在标签的0,0坐标处单击,该坐标将始终位于标签的左上角,因为无法滚动标签的内部


注意:不可能在画布上嵌入标签小部件(或任何其他小部件),然后在标签顶部绘制。官方canvas文档对此进行了说明:

注意:由于窗口管理方式的限制,无法在窗口项的顶部绘制其他图形项(如线条和图像)。窗口项始终遮挡与其重叠的任何图形,而不管它们在显示列表中的顺序如何


你怎么能在标签上画画?你确定你能做到吗?画布文档非常清楚,您不能在嵌入式小部件上绘制其他画布对象。这是我的问题。当我绑在画布上时,我会画画。但是,当我绑定到标签时,我就不能这样做了。因此,我该怎么做呢?你误解了我的问题。即使你能够正确地计算坐标(你也可以),你也无法在画布上画出一条显示在标签顶部的线。我明白了,所以我唯一的选择就是转换为画布,对吗?@Jonathan:我不知道你到底想做什么。如果要在画布上的其他对象的顶部绘制多边形,则无法在嵌入式小部件的顶部绘制。这在规范文档中有详细说明。我已经包含了来自tcl/tk文档的相关短语(tkinter只是tcl/tk解释器的薄薄包装)。