【问题标题】:Mouse Position Python Tkinter鼠标位置 Python Tkinter
【发布时间】:2014-04-08 00:39:50
【问题描述】:

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

【问题讨论】:

标签: python tkinter mouse-position


【解决方案1】:

您可以设置回调以响应 <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 设置为鼠标坐标,然后可以从其他类方法访问。

【讨论】:

  • 我可以把它作为一个变量返回吗?
  • 好吧,没有任何东西接收到回调的返回值,所以从motion返回它是没有用的。
  • 我可以在函数中将 x,y 设置为 var 吗?
  • 使用上面的脚本 tkinter.TclError 得到以下错误:没有显示名称和没有 $DISPLAY 环境变量
  • 这样做的问题是,如果您尝试在另一个事件处理程序中使用self.xself.y,它将是上一个事件发生时的鼠标位置,这可能离得很远。如果当前事件没有指针位置,我认为 Bryan Oakley 的回答是更好的解决方案。
【解决方案2】:

您可以随时使用winfo_pointerxwinfo_pointery 方法获取相对于根窗口的x,y 坐标。要将其转换为绝对屏幕坐标,您可以获得winfo_pointerxwinfo_pointery,并从中减去相应的winfo_rootxwinfo_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()

【讨论】:

  • 当您想要获取从顶层抓取内部单击的 ttk::notebook 选项卡的 tab_id 时,这很方便(笔记本位于顶层小部件的外部)。
  • 这似乎是更好的答案。
  • 似乎相对坐标和绝对坐标混淆了
  • 我认为这是制作工具提示的更好解决方案,该工具提示将在 1 秒后出现在鼠标指针的坐标中。绑定解决方案在移动时获取鼠标的第一个坐标并等待 1 秒。即使鼠标移动到其他地方,工具提示也会出现在第一个位置。
【解决方案3】:

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

    import pyautogui
    x, y = pyautogui.position()

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

【讨论】:

    【解决方案4】:

    我想改进 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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-01
      • 1970-01-01
      • 2022-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多