使用 Pynput.mouse 时无法跳出 while 循环
Unable To Break Out Of While Loop When Using Pynput.mouse
我有一个相对简单的程序,它监听鼠标点击,当鼠标按钮被按下时打印“1"s. Unfortunately when I let go of the mouse it just keeps printing "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
在循环内不会发生变化。有 not 检查鼠标是否被点击的语句:你唯一的 if
语句检查当你进入函数时鼠标是否被点击。 pressed
在函数内没有变化。
看关键逻辑:
if pressed == True:
while ...
...
if pressed == False:
break
这里没有任何东西可以改变pressed
的值;第一个 if
保证它在循环中的任何地方 True
。
是的,您需要设置另一个在循环内运行的侦听器。您已经知道构建块:在函数中创建一个新的构建块并将其绑定到另一个中断循环的操作。例如,您可以 "cheat" 并将其重置为 pressed
作为全局变量。
如果你想要一个整体的处理程序解决方案,你也可以在其他答案中研究如何做到这一点。 keypress 和 keyrelease 已经足够频繁了。
import pyautogui, random, time
import pynput
keys = ['w', 's', 'a', 'd']
def on_press(key):
p = True
if key == pynput.keyboard.Key.esc:
return False
else:
while p == True:
press = keys[random.randint(0,3)]
pyautogui.keyDown(press)
pyautogui.keyUp(press)
p = False
with pynput.keyboard.Listener(on_press=on_press) as L:
L.join()
像这样的代码将代替您所做的工作。
顺便说一句,这只是一个例子;欢迎访问我的 GitHub 页面:github.com/ironnicko
我有一个相对简单的程序,它监听鼠标点击,当鼠标按钮被按下时打印“1"s. Unfortunately when I let go of the mouse it just keeps printing "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
在循环内不会发生变化。有 not 检查鼠标是否被点击的语句:你唯一的 if
语句检查当你进入函数时鼠标是否被点击。 pressed
在函数内没有变化。
看关键逻辑:
if pressed == True:
while ...
...
if pressed == False:
break
这里没有任何东西可以改变pressed
的值;第一个 if
保证它在循环中的任何地方 True
。
是的,您需要设置另一个在循环内运行的侦听器。您已经知道构建块:在函数中创建一个新的构建块并将其绑定到另一个中断循环的操作。例如,您可以 "cheat" 并将其重置为 pressed
作为全局变量。
如果你想要一个整体的处理程序解决方案,你也可以在其他答案中研究如何做到这一点。 keypress 和 keyrelease 已经足够频繁了。
import pyautogui, random, time
import pynput
keys = ['w', 's', 'a', 'd']
def on_press(key):
p = True
if key == pynput.keyboard.Key.esc:
return False
else:
while p == True:
press = keys[random.randint(0,3)]
pyautogui.keyDown(press)
pyautogui.keyUp(press)
p = False
with pynput.keyboard.Listener(on_press=on_press) as L:
L.join()
像这样的代码将代替您所做的工作。 顺便说一句,这只是一个例子;欢迎访问我的 GitHub 页面:github.com/ironnicko