32

有没有办法获取鼠标的位置并将其设置为 var?

4

4 回答 4

43

您可以设置一个回调来响应<Motion>事件:

import Tkinter as tk
root = tk.Tk()

def motion(event):
    x, y = event.x, event.y
    print('{}, {}'.format(x, y))

root.bind('<Motion>', motion)
root.mainloop()

我不确定你想要什么样的变量。上面,我设置了局部变量xy鼠标坐标。

如果你创建motion一个类方法,那么你可以设置实例属性self.xself.y鼠标坐标,然后可以从其他类方法访问。

于 2014-04-08T00:53:36.697 回答
41

在任何时间点,您都可以使用该方法winfo_pointerxwinfo_pointery获取相对于根窗口的 x,y 坐标。要将其转换为绝对屏幕坐标,您可以获得winfo_pointerxor winfo_pointery,并从中减去相应的winfo_rootxorwinfo_rooty

例如:

root = tk.Tk()
...
x = root.winfo_pointerx()
y = root.winfo_pointery()
abs_coord_x = root.winfo_pointerx() - root.winfo_rootx()
abs_coord_y = root.winfo_pointery() - root.winfo_rooty()
于 2014-04-08T16:45:38.050 回答
5

就个人而言,我更喜欢使用pyautogui,即使与 Tkinter 结合使用。它不仅限于 Tkinter 应用程序,而是在整个屏幕上工作,甚至在双屏配置下。

    import pyautogui
    x, y = pyautogui.position()

如果您想保存各种位置,请添加点击事件。
我知道最初的问题是关于 Tkinter 的。

于 2018-05-29T02:47:13.687 回答
5

我想改进 Bryan 的答案,因为这仅在您有 1 台显示器时才有效,但如果您有多台显示器,它将始终使用您相对于主显示器的坐标。为了找到它相对于两个显示器,并获得准确的位置,然后使用vroot, 而不是root, 像这样

root = tk.Tk()
...
x = root.winfo_pointerx()
y = root.winfo_pointery()
abs_coord_x = root.winfo_pointerx() - root.winfo_vrootx()
abs_coord_y = root.winfo_pointery() - root.winfo_vrooty()
于 2019-04-04T12:06:31.120 回答