鱼C论坛

 找回密码
 立即注册
查看: 689|回复: 11

[已解决]实时获取屏幕鼠标坐在位置的坐标

[复制链接]
发表于 2024-7-15 14:28:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在使用python+vscode 的前提下  如何能够获取屏幕鼠标坐在位置的坐标
最佳答案
2024-7-15 15:00:41
wp231957 发表于 2024-07-15 15:00
这个监听事件  如何取消啊   我用CTRL + C  不管用啊


在使用 `pynput` 监听鼠标事件时,如果 `CTRL + C` 无法停止程序,我们可以使用 `pynput` 提供的停止监听方法。你可以在程序中添加一个键盘监听器,当检测到特定按键(例如 `ESC` 键)时,停止鼠标监听。

下面是一个改进后的示例代码,添加了一个键盘监听器来停止鼠标监听:

  1. from pynput import mouse, keyboard
  2. import threading

  3. # 定义一个全局变量来控制监听器的运行
  4. running = True

  5. def on_move(x, y):
  6.     if running:
  7.         print(f'鼠标移动到 ({x}, {y})')

  8. def on_click(x, y, button, pressed):
  9.     if running:
  10.         if pressed:
  11.             print(f'鼠标点击在 ({x}, {y}) 按钮 {button}')

  12. def on_scroll(x, y, dx, dy):
  13.     if running:
  14.         print(f'鼠标滚动在 ({x}, {y})')

  15. def on_press(key):
  16.     global running
  17.     try:
  18.         if key == keyboard.Key.esc:
  19.             print("监听器停止")
  20.             running = False
  21.             return False  # 停止键盘监听器
  22.     except AttributeError:
  23.         pass

  24. # 启动鼠标监听线程
  25. mouse_listener = mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
  26. mouse_listener.start()

  27. # 启动键盘监听线程
  28. keyboard_listener = keyboard.Listener(on_press=on_press)
  29. keyboard_listener.start()

  30. # 保持主线程运行,直到键盘监听器停止
  31. keyboard_listener.join()
  32. mouse_listener.stop()  # 停止鼠标监听器
  33. print("程序已停止")
复制代码


在这个脚本中,键盘监听器会监听按键事件,当检测到 `ESC` 键被按下时,会将 `running` 设置为 `False` 并停止键盘监听器。鼠标监听器的回调函数在检测到 `running` 为 `False` 后会停止打印信息。最后,主线程会等待键盘监听器停止,然后停止鼠标监听器。

这样,你就可以通过按下 `ESC` 键来停止监听器,避免使用 `CTRL + C` 无效的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-15 14:29:18 | 显示全部楼层
在 Python 中实时获取鼠标位置,可以使用 `pyautogui` 这个库。这个库非常方便,用于控制鼠标和键盘。以下是具体步骤:

1. **安装 `pyautogui` 库**:
   打开终端或命令提示符,然后运行以下命令来安装 `pyautogui`:

  
  1. pip install pyautogui
复制代码


2. **编写获取鼠标位置的脚本**:

   下面是一个简单的示例脚本,它会每秒打印一次鼠标当前的位置:

  
  1. import pyautogui
  2.    import time

  3.    try:
  4.        while True:
  5.            x, y = pyautogui.position()  # 获取鼠标当前位置的坐标
  6.            print(f"鼠标当前位置: (x={x}, y={y})")
  7.            time.sleep(1)  # 每秒打印一次
  8.    except KeyboardInterrupt:
  9.        print("程序已停止")
复制代码


3. **在 VSCode 中运行脚本**:

   - 打开 VSCode,创建一个新的 Python 文件(例如 `mouse_position.py`),将上面的代码粘贴进去。
   - 保存文件,然后按 `Ctrl + Shift + P` 调出命令面板,输入 `Run Python File` 选择运行当前 Python 文件。

运行这个脚本,你会看到终端每秒钟打印一次鼠标的当前位置坐标。当你不需要继续获取鼠标位置时,可以按 `Ctrl + C` 停止脚本运行。

这个脚本只是一个简单的示例,如果你需要更复杂的功能,比如在特定条件下触发某些操作,`pyautogui` 也提供了很多其他有用的功能,可以查看它的[官方文档](https://pyautogui.readthedocs.io/en/latest/)以了解更多。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-15 14:37:30 | 显示全部楼层
FishC 发表于 2024-7-15 14:29
在 Python 中实时获取鼠标位置,可以使用 `pyautogui` 这个库。这个库非常方便,用于控制鼠标和键盘。以下 ...

嗯,可以实现,但是 特别是 当鼠标点在其他应用模块的窗口内时   还需要把vscode进行小窗口化处理  很麻烦

和使用电脑版微信  ALT+A 实时获取屏幕点坐标 没法比
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-15 14:38:12 | 显示全部楼层
wp231957 发表于 2024-07-15 14:37
嗯,可以实现,但是 特别是 当鼠标点在其他应用模块的 ...


要实现类似于微信的 `ALT+A` 功能,即在不同窗口之间切换并实时获取鼠标位置坐标,可以使用更底层的库,比如 `pynput` 或 `ctypes`。`pynput` 可以监听全局鼠标事件,下面是一个用 `pynput` 实现的示例代码:

1. **安装 `pynput` 库**:

  
  1. pip install pynput
复制代码


2. **编写实时获取鼠标位置的脚本**:

   下面是一个使用 `pynput` 获取鼠标位置并在终端实时显示的脚本:

  
  1. from pynput import mouse
  2.    import threading

  3.    def on_move(x, y):
  4.        print(f'鼠标移动到 ({x}, {y})')

  5.    def on_click(x, y, button, pressed):
  6.        if pressed:
  7.            print(f'鼠标点击在 ({x}, {y}) 按钮 {button}')

  8.    def on_scroll(x, y, dx, dy):
  9.        print(f'鼠标滚动在 ({x}, {y})')

  10.    # 启动鼠标监听线程
  11.    listener = mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
  12.    listener.start()

  13.    # 保持主线程运行
  14.    try:
  15.        listener.join()
  16.    except KeyboardInterrupt:
  17.        print("程序已停止")
复制代码


3. **在 VSCode 中运行脚本**:

   - 打开 VSCode,创建一个新的 Python 文件(例如 `mouse_tracker.py`),将上面的代码粘贴进去。
   - 保存文件,然后按 `Ctrl + Shift + P` 调出命令面板,输入 `Run Python File` 选择运行当前 Python 文件。

运行这个脚本后,你就可以在任何窗口中获取鼠标的位置、点击和滚动事件,并在终端实时显示。这样你就不需要把 VSCode 窗口放在前面,可以随时切换到其他应用程序。

希望这个方法能解决你的问题,能达到你预期的效果!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-15 14:50:04 | 显示全部楼层
FishC 发表于 2024-7-15 14:38
要实现类似于微信的 `ALT+A` 功能,即在不同窗口之间切换并实时获取鼠标位置坐标,可以使用更底层的库 ...

我在用pip list 时  发现  它居然服务于3.8版本   可是py -0  我默认的版本是3.9
我pip时  如何能pip 到3.9里呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-15 14:51:17 | 显示全部楼层
wp231957 发表于 2024-07-15 14:50
我在用pip list 时  发现  它居然服务于3.8版本   可 ...


在系统上可能会有多个版本的 Python 安装,为了确保你安装的库对应到正确的 Python 版本,你需要明确指定使用哪个版本的 `pip`。以下是一些常见的方法:

### 方法一:使用 `python3.9 -m pip` 命令

1. 使用具体的 Python 版本调用 `pip` 安装库:

  1. python3.9 -m pip install pynput
复制代码


这条命令会确保 `pynput` 库安装到 Python 3.9 版本中。

### 方法二:使用虚拟环境

创建一个虚拟环境,确保所有库都安装到特定的 Python 版本中。

1. 创建一个虚拟环境,指定 Python 3.9 版本:

  1. python3.9 -m venv myenv
复制代码


2. 激活虚拟环境:

- 在 Windows 上:

  1. myenv\Scripts\activate
复制代码


- 在 macOS/Linux 上:

  1. source myenv/bin/activate
复制代码


3. 激活虚拟环境后,使用 `pip` 安装所需的库:

  1. pip install pynput
复制代码


在虚拟环境中,`pip` 命令会默认安装到该虚拟环境中的 Python 版本。

### 方法三:指定 `pip3.9`

你也可以直接使用 `pip3.9` 命令(如果你的系统已经配置了这个命令):

  1. pip3.9 install pynput
复制代码


### 检查库是否安装到正确的 Python 版本

你可以通过检查具体的 Python 版本来确认库是否安装成功:

1. 打开 Python 3.9 的交互式解释器:

  1. python3.9
复制代码


2. 在解释器中尝试导入库:

  1. import pynput
  2. print(pynput.__version__)
复制代码


如果没有错误并且显示了版本号,说明库已经正确安装到该 Python 版本中。

希望这些方法能帮你顺利地将库安装到正确的 Python 版本中!如果还有其他疑问,随时欢迎继续提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-15 15:00:21 | 显示全部楼层
FishC 发表于 2024-7-15 14:38
要实现类似于微信的 `ALT+A` 功能,即在不同窗口之间切换并实时获取鼠标位置坐标,可以使用更底层的库 ...

这个监听事件  如何取消啊   我用CTRL + C  不管用啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-15 15:00:41 | 显示全部楼层    本楼为最佳答案   
wp231957 发表于 2024-07-15 15:00
这个监听事件  如何取消啊   我用CTRL + C  不管用啊


在使用 `pynput` 监听鼠标事件时,如果 `CTRL + C` 无法停止程序,我们可以使用 `pynput` 提供的停止监听方法。你可以在程序中添加一个键盘监听器,当检测到特定按键(例如 `ESC` 键)时,停止鼠标监听。

下面是一个改进后的示例代码,添加了一个键盘监听器来停止鼠标监听:

  1. from pynput import mouse, keyboard
  2. import threading

  3. # 定义一个全局变量来控制监听器的运行
  4. running = True

  5. def on_move(x, y):
  6.     if running:
  7.         print(f'鼠标移动到 ({x}, {y})')

  8. def on_click(x, y, button, pressed):
  9.     if running:
  10.         if pressed:
  11.             print(f'鼠标点击在 ({x}, {y}) 按钮 {button}')

  12. def on_scroll(x, y, dx, dy):
  13.     if running:
  14.         print(f'鼠标滚动在 ({x}, {y})')

  15. def on_press(key):
  16.     global running
  17.     try:
  18.         if key == keyboard.Key.esc:
  19.             print("监听器停止")
  20.             running = False
  21.             return False  # 停止键盘监听器
  22.     except AttributeError:
  23.         pass

  24. # 启动鼠标监听线程
  25. mouse_listener = mouse.Listener(on_move=on_move, on_click=on_click, on_scroll=on_scroll)
  26. mouse_listener.start()

  27. # 启动键盘监听线程
  28. keyboard_listener = keyboard.Listener(on_press=on_press)
  29. keyboard_listener.start()

  30. # 保持主线程运行,直到键盘监听器停止
  31. keyboard_listener.join()
  32. mouse_listener.stop()  # 停止鼠标监听器
  33. print("程序已停止")
复制代码


在这个脚本中,键盘监听器会监听按键事件,当检测到 `ESC` 键被按下时,会将 `running` 设置为 `False` 并停止键盘监听器。鼠标监听器的回调函数在检测到 `running` 为 `False` 后会停止打印信息。最后,主线程会等待键盘监听器停止,然后停止鼠标监听器。

这样,你就可以通过按下 `ESC` 键来停止监听器,避免使用 `CTRL + C` 无效的情况。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-15 15:04:59 | 显示全部楼层
FishC 发表于 2024-7-15 15:00
在使用 `pynput` 监听鼠标事件时,如果 `CTRL + C` 无法停止程序,我们可以使用 `pynput` 提供的停止监 ...

vscode中   import threading  后面的threading会出现波浪线  然后点击会有下面的信息

能否取消这个波浪线

"d:\Python39\Lib\threading.py"正在替代 stdlib 模块"threading"PylancereportShadowedImports
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-15 15:05:10 | 显示全部楼层
wp231957 发表于 2024-07-15 15:04
vscode中   import threading  后面的threading会出现 ...


这波浪线提示(“shadowed imports”警告)是由 Pylance(VSCode 的 Python 扩展之一)触发的,它检测到你的目录中有一个自定义的 `threading` 模块,覆盖了 Python 标准库的 `threading` 模块。

为了避免这个问题并取消波浪线提示,可以按照以下几种方法进行解决:

### 方法一:重命名本地文件

检查一下你当前的工作目录中有没有一个名为 `threading.py` 的文件。如果有的话,将它重命名为其他名称,以避免与标准库冲突。

### 方法二:配置 Pylance 禁用特定警告

如果你没有自己创建 `threading.py` 文件,可以通过配置 VSCode 来禁用特定的警告。

1. 打开 VSCode 设置文件(`.vscode/settings.json`)。如果这个文件不存在,可以手动创建。
2. 加入以下配置来禁用 `reportShadowedImports` 警告:

  1. {
  2.     "python.analysis.diagnosticSeverityOverrides": {
  3.         "reportShadowedImports": "none"
  4.     }
  5. }
复制代码


这样,VSCode 就不会再提示这个特定的警告了。

### 方法三:使用虚拟环境

使用虚拟环境可以将你的项目依赖与系统的全局依赖隔离开,避免各种潜在的冲突。

1. 创建并激活虚拟环境(参考前面提到的如何创建和激活虚拟环境的步骤)。

2. 在虚拟环境中安装所需的库,并运行代码。

### 检查项目根目录

确保你的项目根目录下没有任何与标准库相同名称的文件或文件夹,这些文件会遮蔽掉标准库的模块。

希望这些方法能够帮助你解决问题,并顺利取消波浪线提示。如果你有其他问题或需要进一步的帮助,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-16 14:39:05 | 显示全部楼层
FishC 发表于 2024-7-15 15:05
这波浪线提示(“shadowed imports”警告)是由 Pylance(VSCode 的 Python 扩展之一)触发的,它检测 ...

如果给你一个比较大的数字比如
1234567891
你咋能快速的知道他是一个质数  还是一个合数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-16 14:39:40 | 显示全部楼层
wp231957 发表于 2024-07-16 14:39
如果给你一个比较大的数字比如
1234567891
你咋能快 ...


判断一个大数是否为质数(素数)可以通过多种方法实现,其中一些方法非常高效。以下是几种常见的方法和一个 Python 实现示例:

### 方法一:朴素试除法

这种方法适合较小的数字,对于大数效率不高。它通过尝试将数字除以小于其平方根的所有素数来确定是否为素数。

### 方法二:埃拉托斯特尼筛法

这是一种筛选法,适用于生成较小范围内的所有素数,但对于单个大数的判定不太适用。

### 方法三:费马素性测试

这种方法是基于费马小定理的概率测试,适用于较大的数字,但不能确定地判断某数是否为素数。

### 方法四:Miller-Rabin素性测试

这是一个概率算法,通过重复多次测试可以非常高效地判断一个大数是否为素数。以下是 Python 实现的 Miller-Rabin 素性测试:

  1. import random

  2. def is_prime(n, k=5):
  3.     """使用Miller-Rabin素性测试判断一个数是否为素数"""
  4.    
  5.     if n <= 1:
  6.         return False
  7.     if n <= 3:
  8.         return True
  9.     if n % 2 == 0:
  10.         return False

  11.     # 找到 d 和 r 使得 n-1 = d * 2^r
  12.     r, d = 0, n - 1
  13.     while d % 2 == 0:
  14.         d //= 2
  15.         r += 1

  16.     # 进行 k 次测试
  17.     for _ in range(k):
  18.         a = random.randint(2, n - 2)
  19.         x = pow(a, d, n)
  20.         if x == 1 or x == n - 1:
  21.             continue
  22.         for _ in range(r - 1):
  23.             x = pow(x, 2, n)
  24.             if x == n - 1:
  25.                 break
  26.         else:
  27.             return False
  28.     return True

  29. # 测试数字
  30. number = 1234567891
  31. if is_prime(number):
  32.     print(f"{number} 是一个质数")
  33. else:
  34.     print(f"{number} 是一个合数")
复制代码


### 解释:

1. **基本检查**:首先排除一些小数和偶数的情况。
2. **找到 `d` 和 `r`**:使得 `n-1` 可以表示为 `d * 2^r`。
3. **进行 k 次测试**:选择一个随机数 `a`,通过快速幂算法计算 `a^d % n`,然后进行多次平方操作。如果在任何一次测试中都没有通过,那么 `n` 可能是合数。

### Miller-Rabin 素性测试的优点:

- 它的效率高,适用于较大的数。
- 通过增加测试次数 `k` 可以提高结果的可靠性。

这个方法在实践中被广泛使用,并且在大多数情况下可以快速、可靠地判断一个大数是否为素数。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 05:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表