Python在单击时获取鼠标x,y位置

Posted

技术标签:

【中文标题】Python在单击时获取鼠标x,y位置【英文标题】:Python get mouse x, y position on click 【发布时间】:2014-09-15 13:12:12 【问题描述】:

来自 IDL,我发现在 python 中使用一种不像 tkinter 那样过度杀伤的方法很难在单击左键时获得鼠标的 x-y 位置。有谁知道一个 python 包,它包含一个在单击鼠标时简单地返回 x-y 的方法(类似于 IDL 中的光标方法)?

【问题讨论】:

我已经投票决定重新提出这个问题。我不同意它被关闭为“太宽泛”。 OP 要求提供一种在鼠标单击时获取坐标的方法,而不必诉诸 tkinter 过度杀伤(例如:***.com/questions/5501192/…)这有什么太宽泛的? 【参考方案1】:

您可以使用许多库。以下是两个第三方的:

使用 PyAutoGui

强大的 GUI 自动化库可让您获取屏幕大小、控制鼠标、键盘等。

要获得该位置,您只需要使用position() 函数。这是一个例子:

>>>import pyautogui
>>>pyautogui.position()
(1358, 146)
>>>

1358 是 X 位置,146 是 Y 位置。

相关link to the documentation

使用 Pynput

另一个(更简约的)库是 Pynput:

>>> from pynput.mouse import Controller
>>> mouse = Controller()
>>> mouse.position
(1182, 153)
>>>

1182 是 X 位置,153 是第二个位置。

Documentation

这个库很容易学习,不需要依赖,这使得这个库非常适合像这样的小任务(PyAutoGui 会有点过头了)。不过,再一次,它并没有提供这么多的功能。

Windows 特定:

对于平台相关,但可以在此处找到默认库选项(尽管您可能仍然认为它们过大):Getting cursor position in Python。

【讨论】:

但是如何在鼠标点击时执行这个呢?【参考方案2】:

使用PyMouse

>>> import pymouse
>>> mouse = pymouse.PyMouse()
>>> mouse.position()
(231L, 479L)

【讨论】:

另请参阅库 PyUserInput,它集成了 PyMouse 的代码,并且看起来更流行。它的依赖项之一 PyHook 正式仅支持 32 位,但可以在 here 找到第三方 64 位安装程序。 你可以通过继承PyMouseEvent类来监听鼠标点击事件。请参阅 PyUserInput 页面上的“Clickonacci”示例。 这没有回答如何获得位置当鼠标被点击【参考方案3】:

使用 pygame

import pygame

mouse_pos = pygame.mouse.get_pos()

这将返回鼠标的 x 和 y 位置。

查看此网站:https://www.pygame.org/docs/ref/mouse.html#pygame.mouse.set_pos

【讨论】:

如果我使用它,我会得到pygame.error: video system not initialized,如果我使用pygame.init(),那么无论我的光标在哪里,我都会得到一个恒定的 (0,0) 位置。 这没有回答如何获得位置当鼠标被点击【参考方案4】:

例如,对于绘图或图像,可以使用名为ginputmatplotlib 工具。 每次单击鼠标时,所选点的[x,y] 坐标都会存储在一个变量中。

# show image
fig, ax=plt.subplots()
ax.imshow(img)

# select point
yroi = plt.ginput(0,0)

使用ginput(0,0),您可以选择绘图或图像上的任何点。

这里是ginput documentation的链接

https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.ginput.html

【讨论】:

【参考方案5】:

这是一个带有 tkinter 的画布示例:

def callback(event):  
    print("clicked at: ", event.x, event.y)  

canvas.bind("<Button-1>", callback)

【讨论】:

【参考方案6】:

对于乌龟:

def get_mouse_click_coor(x, y):
    print(x, y)

turtle.onscreenclick(get_mouse_click_coor)

【讨论】:

最后添加turtle.mainloop(),这样当你点击时屏幕保持打开状态。【参考方案7】:

这是我前几天做的。 右键/左键获取颜色或位置的功能:

#Add Any helpfull stuff in functions here for later use
def GetMouseInfos(WhatToGet="leaving emety will get you x and y", GetXOnly=False, GetYOnly=False, GetColor=False, Key='Right', OverrideKey=False):#gets color of whats under Key cursor on right click
    try:
        import win32api
    except ModuleNotFoundError:
        print("win32api not found, to install do pip install pywin32")
    try:
        import time
    except ModuleNotFoundError:
        print("time not found, to install do pip install time?")
    try:
        import pyautogui
    except ModuleNotFoundError:
        print("py auto gui not found, to install do pip install pyautogui")
    #--------------------------------------------------------------
    #above checks if needed modules are installed if not tells user
    #code below is to get all varibles needed
    #---------------------------------------------------------------
    print(WhatToGet)
    if OverrideKey:
        Key_To_click = Key
    if Key == 'Left':
        Key_To_click = 0x01
    if Key == 'Right':
        Key_To_click = 0x02
    if Key == 'Wheel':
        Key_To_click = 0x04
    state_left = win32api.GetKeyState(Key_To_click)  # Left button up = 0 or 1. Button down = -127 or -128
    IsTrue = True
    while IsTrue:
        a = win32api.GetKeyState(Key_To_click)
        if a != state_left:  # Button state changed
            state_left = a
            if a < 0:
                global Xpos, Ypos
                Xpos, Ypos = win32api.GetCursorPos()
                x, y = pyautogui.position()
                pixelColor = pyautogui.screenshot().getpixel((x, y))
            else:
                posnowX, posnowY = win32api.GetCursorPos()
                win32api.SetCursorPos((posnowX, posnowY))
                IsTrue = False#remove this for it to keep giving coords on click without it just quitting after 1 click
        time.sleep(0.001)
    #--------------------------------------------------------------------
    #The Code above is the code to get all varibles and code below is for the user to get what he wants
    #--------------------------------------------------------------------
    
    if GetXOnly: #Checks if we should get Only X (def options) the command to do this would be GetKeyInfos("Click To get X ONLY", True)
        if GetYOnly:
            return(Xpos , Ypos)
        if GetColor:
            return(Xpos, pixelColor)
        return(Xpos)
    if GetYOnly: #Checks if we should get Only Y (def options) the command to do this would be GetKeyInfos("Click To get X ONLY",False, True)
        if GetXOnly:
            return(Xpos , Ypos)
        if GetColor:
            return(Ypos, pixelColor) 
        return(Ypos)
    if GetColor:
        return(pixelColor) #Checks 
    return(Xpos, Ypos)
# getKeyinfos("Anything here without any other guidelines will give u x and y only on right click")

【讨论】:

【参考方案8】:

你们都把它弄得太难了,就像这样简单:

import pyautogui as pg

pos = pg.position()

# for x pos
print(pos[0])

# for y pos
print(pos[1])

【讨论】:

以上是关于Python在单击时获取鼠标x,y位置的主要内容,如果未能解决你的问题,请参考以下文章

当按下鼠标并释放鼠标时,如何保存鼠标位置?

C#winform有2个panel,在右边panel获取鼠标的坐标(x,y),如何传递到panel1上弹出的窗口form2里面呢

js获取鼠标距离

Python:将鼠标位置保存在一个列表中

如何在 C++/OpenGL 中获取当前鼠标位置?

DelPhi怎样模拟鼠标单击?