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】:
例如,对于绘图或图像,可以使用名为ginput
的matplotlib
工具。
每次单击鼠标时,所选点的[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里面呢