获取光标在tkinter中的绝对位置

时间:2016-07-18 04:26:59

标签: python canvas tkinter tkinter-canvas

所以我有一位来自我的主管的代码,我在理解方面遇到了问题。我希望使用create_rectangle方法在我的光标所在的位置绘制一个矩形,我将参数/坐标设为:

rect = create_rectangle(x, y, x + 10, y + 10, fill = 'blue', width = 0)

我希望此处xy是我的光标相对于我的根窗口的当前坐标。

在将代码传递给此函数之前,我的代码中计算xy的方式是:

x = root.winfo_pointerx() - root.winfo_rootx()
y = root.winfo_pointery() - root.winfo_rooty()

我不能为我的生活理解为什么这样做了。我试过做

x = root.winfo_pointerx()
y = root.winfo_pointery()

也只是

x = root.winfo_rootx()
y = root.winfo_rooty()

但这些都不会绘制光标所在的矩形。我也试着查看文档,但无法真正理解发生了什么。

那么为什么x = root.winfo_pointerx() - root.winfo_rootx()y = root.winfo_pointery() - root.winfo_rooty()在这里完成?

2 个答案:

答案 0 :(得分:3)

您在询问绝对SCREEN 相对鼠标指针的位置之间的区别。

符号:

x = root.winfo_pointerx() - root.winfo_rootx()
y = root.winfo_pointery() - root.winfo_rooty()

反映了鼠标指针的绝对位置,与winfo_pointerx()w.winfo_pointery()(或w.winfo_pointerxy())相反,它反映了鼠标指针相对于 w 的根窗口。

但绝对和相对的概念是什么意思?

winfo_rootx()winfo_rooty()分别返回根窗口中此窗口小部件的xy坐标左上角。 但这些xy坐标是根据您的笔记本电脑的屏幕计算的

winfo_pointerx()winfo_pointery()将鼠标指针的x和y坐标相对于主根窗口返回 SCREEN

因此,仅运行winfo_pointerxy(),您只考虑根窗口本身,但忽略其余部分( SCREEN )。

但问题是,当您在根窗口上移动鼠标时,不要忘记您的系统正在根据您的笔记本电脑计算坐标 SCREEN

替代方法

请注意,您可以替换当前的代码:

def get_absolute_position(event=None):
    x = root.winfo_pointerx() - root.winfo_rootx()
    y = root.winfo_pointery() - root.winfo_rooty()
    return x, y

通过其他方法利用事件的坐标:

def get_absolute_position(event):
    x = event.x
    y = event.y
    return x, y

答案 1 :(得分:1)

简单:

from tkinter import *
root = Tk()

def f(event):
    print(event.x, event.y)

root.bind("<Motion>", f)