python - 使用 Pynput.mouse 时无法跳出 While 循环
问题描述
我有这个相对简单的程序,它监听鼠标点击,当按住鼠标按钮时打印“1”。不幸的是,当我放开鼠标时,它只会继续打印“1”,即使有一个 if 语句检查鼠标是否被点击,如果不是,则应该停止循环。我正在使用该pynput.mouse
模块进行鼠标交互。
这是我的代码:
import time
from pynput.mouse import Listener
def clicked(x, y, button, pressed):
if pressed == True:
while button == button.left:
print("1")
time.sleep(1)
if pressed == False:
break
with Listener(on_click=clicked) as listener:
listener.join()
我的理论是,一旦循环开始,它就会停止监听鼠标点击,所以它永远不会停止循环。是否有必要为循环创建一个新线程?如果是,我会怎么做?
谢谢!
解决方案
您当前的逻辑使您无法摆脱循环,因为pressed
在循环内不会改变。没有检查鼠标是否被点击的语句:你唯一的if
语句检查当你进入函数时鼠标是否被点击。 pressed
在函数内不变。
看看关键逻辑:
if pressed == True:
while ...
...
if pressed == False:
break
这里没有任何东西可以改变pressed
; 第一个if
保证它True
在循环内的任何地方。
是的,您需要设置另一个在循环内运行的侦听器。您已经知道构建块:在函数中创建一个新块并将其绑定到另一个中断循环的操作。例如,您可能会“作弊”并将其重置pressed
为全局变量。
如果您想要一个整体处理程序解决方案,您还可以在其他答案中研究如何做到这一点。keypress 和 keyrelease 已经足够频繁地完成了。
推荐阅读
- sql - BigQuery concat 返回 null 连接空字符串
- c - 如何让子进程等待孙子进程?
- c# - 哪种方式更适合 MySQL 连接字符串?
- git - 仅从一个管道检查 Jenkins 构建状态,并避免其他管道在 PR 构建中指向相同的 gitlab 存储库
- go - 如何输出读取为整数的数字的平方
- flutter - 如何摆脱appbar和body之间的界限?
- node.js - 在 fetch() 发出删除请求后重定向
- javascript - 想做一个这样的自定义轮播不知道这实际上叫什么?
- react-native - React Native:如何在地图上更新标记?
- reactjs - React on GitHub Pages refresh url not found