【发布时间】:2014-04-08 00:39:50
【问题描述】:
有没有办法获取鼠标的位置并将其设置为var?
【问题讨论】:
标签: python tkinter mouse-position
有没有办法获取鼠标的位置并将其设置为var?
【问题讨论】:
标签: python tkinter mouse-position
您可以设置回调以响应 <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()
我不确定你想要什么样的变量。以上,我将局部变量x和y设置为鼠标坐标。
如果将motion 设为类方法,则可以将实例属性self.x 和self.y 设置为鼠标坐标,然后可以从其他类方法访问。
【讨论】:
motion返回它是没有用的。
self.x 和self.y,它将是上一个事件发生时的鼠标位置,这可能离得很远。如果当前事件没有指针位置,我认为 Bryan Oakley 的回答是更好的解决方案。
您可以随时使用winfo_pointerx 和winfo_pointery 方法获取相对于根窗口的x,y 坐标。要将其转换为绝对屏幕坐标,您可以获得winfo_pointerx 或winfo_pointery,并从中减去相应的winfo_rootx 或winfo_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()
【讨论】:
就个人而言,我更喜欢使用pyautogui,即使与 Tkinter 结合使用。它不仅限于 Tkinter 应用程序,而是在整个屏幕上工作,甚至在双屏配置上。
import pyautogui
x, y = pyautogui.position()
如果您想保存各种位置,请添加点击事件。
我知道最初的问题是关于 Tkinter。
【讨论】:
我想改进 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()
【讨论】: